静态类vs带构造函数性能的类

本文关键字:性能 构造函数 vs 静态类 | 更新日期: 2023-09-27 18:02:23

这样做有什么区别吗?:

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

StaticTestClass中使用该参数调用Function是否会对性能产生影响?

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

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

使用1000000000迭代和每次迭代创建ConstructedClass

静态方式:72542ms

构造方式:83579ms

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

静态方式:7203ms

构造方式:7259ms

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

静态类vs带构造函数性能的类

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

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

在您的情况下,我可能会选择静态方法。根据您展示的代码,您并不真正需要维护对要执行操作的对象的引用。在它上面执行一个功能,然后完成它。

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

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

我测试了100000000次迭代:

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