静态类vs具有构造函数性能的类

时间:2016-08-12 20:16:53

标签: c# performance class constructor static

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

 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实例会对内存产生影响吗?

使用参数Function调用StaticTestClass会对性能产生影响吗?

PS:对此有类似的问题,但我找不到一个在很多电话中表达性能的问题。

编辑:我做了一些测试,这就是结果:

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

静态方式:72542ms

构建方式:83579ms

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

静态方式:7203ms

构建方式:7259ms

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

2 个答案:

答案 0 :(得分:2)

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

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

在你的情况下,我可能会选择静态方法。根据您显示的代码,您不需要维护对要执行某些操作的对象的引用。对它执行一项功能,并完成它。

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

答案 1 :(得分:1)

一个区别是,生成的对象必须被垃圾收集。静态调用不会产生这种开销。

我测试了100000000次迭代:

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