【问题标题】:C# best practice for performance: object creation vs reuseC# 性能最佳实践:对象创建与重用
【发布时间】:2012-09-20 12:04:43
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 创作的哪一部分是昂贵的?是“弄清楚167个值应该是什么”吗?如果是这样,你能改进吗? 自己创建对象并不那么昂贵;如果您仍然需要设置 167 值,那么某种池是不可能提供帮助的。
  • 你的班级究竟做了什么?听起来像是一个糟糕的架构决策,但如果我们不知道具体细节,我们无法真正提供答案。
  • 鉴于我对 MyUtil 知之甚少,它闻起来像神级课程。
  • +1 到@MarcGravell,你计算出这些成员变量的设置需要多长时间吗?
  • 如果您想要一个有意义的答案,我认为您必须向我们提供更多信息。

标签: c# performance object reusability


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 2010-10-04
      • 2021-09-24
      • 2011-12-07
      • 1970-01-01
      相关资源
      最近更新 更多