【问题标题】:Static class vs Class with constructor performance [duplicate]静态类与具有构造函数性能的类[重复]
【发布时间】:2016-12-19 22:24:59
【问题描述】:

在性能方面这样做有什么不同吗?:

 public static Class StaticTestClass()
 {
   public static void Function(object param) => //Do stuff with "param"
 }

还有这个:

 public Class ConstructedTestClass()
 {
   private object classParam;
   public ConstructedTestClass(object param)
   {
    classParam = param;
   }
   public void Function() => //Do stuff with "classParam"
 }

我认为如果执行一次不会有任何性能差异,但是如果我必须执行多次,并且多次调用Function() 怎么办?

ConstructedTestClass 的多个实例会影响内存吗?

并且使用参数调用FunctionStaticTestClass 会对性能产生任何影响吗?

PS:有类似的问题,但我找不到一个可以解决多次调用的性能问题。

编辑:我做了一些测试,结果如下:

使用1000000000 迭代并在每次迭代中创建一个ConstructedClass

静态方式:72542ms

构造方式:83579ms

在这种情况下静态方式更快,然后我尝试在每次调用Function()时不创建一个类,结果如下:[100000000 samples]

静态方式:7203ms

构造方式:7259ms

在这种情况下几乎没有区别,所以我想我可以做任何我最喜欢的事情,因为我不会创建 1000000000 个类的实例。

【问题讨论】:

  • 你说过 很多次 .. 但是有多少次?有所作为可能并不过分。您想比较这两种方法,只需尝试它们并使用Stopwatch 类来测量时间。
  • 有许多类似的问题很容易被重复。但更重要的是您是否真的分析了代码以查看是否存在足够重要的差异?我猜你没有,因为如果你有,你会发现差异如此之小,以至于几乎不可能正确测量。设计适当的应用程序比担心这种级别的微优化要好得多。
  • @null:请将您的测量结果作为答案发布...不在您的问题中。

标签: c# performance class constructor static


【解决方案1】:

一个区别是,生成的对象必须进行垃圾回收。静态调用不会发生这种开销。

我测试了 100000000 次迭代:

  • 静态版本大约需要 0.7 秒
  • 非静态版本(一次创建实例并调用方法n 次)大约需要 0.7 秒。
  • 非静态版本(每次调用创建一个实例)大约需要 1.4 秒。

【讨论】:

  • 调用函数不受垃圾回收的影响。事实上,您可以在应用程序的整个生命周期内调用同一实例上的函数。
  • 如果参数由于传递给构造函数而发生更改,则不会。
  • 我自己在做测试,我会编辑问题并发布结果。
  • 很好,我期待看到你的结果:)。
【解决方案2】:

从技术上讲,静态方法每次调用会稍微快一些,因为静态方法不必检查它所附加的对象(因为它不是)是否已被实例化。这发生在幕后。 (从技术上讲,设置对象等会产生其他轻微的开销。)

不过,在大多数情况下,这并不是选择其中一个的好理由。他们有不同的目的。静态方法不能像对象一样维护内部变量的状态。

在您的情况下,我可能会选择静态方法。根据您显示的代码,您没有真正需要维护对您想要做某事的对象的引用。对它执行一个功能,并完成它。

使用另一种方法,您必须创建一个对象,然后调用该方法。此外,它的设置方式,您必须为每个必须对其执行操作的目标对象实例化一个新对象,因为该方法所作用的私有变量中存储了一个引用。对我来说,从可读性的角度来看,这会更加令人困惑。

【讨论】:

    猜你喜欢
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2018-06-15
    • 1970-01-01
    • 2011-10-07
    • 2018-01-12
    相关资源
    最近更新 更多