静态类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个实例。
从技术上讲,静态方法每次调用都会稍微快一些,因为静态方法不需要检查它所附加的对象是否已经实例化(因为它没有)。这些都发生在幕后。(从技术上讲,会有其他轻微的开销来设置对象等)
在大多数情况下,选择其中一个而不是另一个并不是一个很好的理由。它们有不同的目的。静态方法不能像对象那样维护内部变量的状态。
在您的情况下,我可能会选择静态方法。根据您展示的代码,您并不真正需要维护对要执行操作的对象的引用。在它上面执行一个功能,然后完成它。
对于另一种方法,您必须创建一个对象,然后调用该方法。此外,它的设置方式是,您必须为必须执行操作的每个目标对象实例化一个新对象,因为方法所操作的私有变量中存储有一个引用。对我来说,从可读性的角度来看,这会更令人困惑。一个区别是,生成的对象必须被垃圾收集。这种开销不会发生在静态调用中。
我测试了100000000次迭代:
- 静态版本需要~0.7秒
- 非静态版本(一次性创建实例并调用方法n
- 非静态版本(每次调用创建一个实例)需要1.4秒。