2

我目前正在对现有 C# 网站进行性能调整。有一个类说.. MyUtil.cs。此类已在所有网页中广泛使用。在某些页面上创建了大约 10/12 个实例 (MyUtil)。我运行了“Redgate”性能分析器。根据 RedGate,对象创建是一项代价高昂的操作。请注意,每个实例都会设置特定的属性并执行特定的操作。所以我不能按原样重用对象。我必须重置所有成员变量。

我想优化这段代码。我考虑过以下选项。请帮助我评估哪种方法更好:

(1) 在“MyUtil.cs”类中创建一个“Reset”方法,该方法将重置所有成员变量(其中有 167 个 :(..),以便我可以在页面类中重用一个对象。

(2) 继续创建多个对象(我在“MyUtil”中有 Dispose() 方法)

(3) 我想到了“对象池”,但我必须再次重置成员。我认为最好在页面级别汇集对象并释放它们,而不是将它们保持在项目级别。

对此的任何答复将不胜感激。提前致谢..!

4

2 回答 2

1

每个应用程序都有多种加速不同大小的机会,比如盘子里的食物种类。创建和初始化对象通常可以是其中之一,并且通常可以是一个大对象。

每当我看到对象创建/初始化需要花费大量时间时,我都会回收使用过的对象。这是一项基本技术,它可以产生很大的不同。但只有当我知道它会节省一小部分时间时,我才会这样做。不要只是按照一般原则去做。

于 2012-09-20T12:10:13.527 回答
0

我建议您始终创建新对象而不是重置对象。之所以如此,原因如下

  • GC 足够聪明,可以对对象进行分类并为其分配一代。这取决于代码中对象的使用。分析是基于代码的执行模式以及代码的体系结构完成的

  • 如果您使用 GC 并让它管理进程,您将能够从硬件获得最佳结果,因为它还根据可用的硬件配置和可用的系统资源决定垃圾收集阈值。

  • 除此之外,您的代码将更加容易和易于管理。- (虽然这不是直接的好处,但也应该至少给它一些权重。)

  • 在页面级别创建对象池也不是一个好主意,因为要重用对象,您必须做两件事,从池中获取它并重置其属性,即您还必须管理池,这是额外的负担

  • 创建单个实例并通过重置属性重新使用它也可能不是一个好主意,因为当您需要多个对象实例时,它将无法工作。

所以结论是,你应该继续在页面中创建对象,让垃圾收集器完成它的工作。

于 2012-09-20T13:56:08.427 回答