静态构造函数会降低访问静态方法的性能吗?
本文关键字:性能 静态方法 访问 构造函数 静态 | 更新日期: 2023-09-27 18:14:53
静态构造函数在第一次访问静态成员时执行。知道了这一点,我有几个问题:
- 这是否意味着每次访问静态方法时,运行时都必须检查是否调用了静态构造函数?
- 这会导致性能下降吗? "无构造函数"静态类可以避免这种性能影响吗?
[EDIT]:我想澄清一下,我不关心微优化。
我问这个问题是因为这是一个设计决定。如果静态构造函数导致性能下降,那么我会在设计代码时考虑到这一点,并且会更加注意可能影响性能的决策。
这里有一个例子来说明我的问题。是否有采取Independent
方法,并把它放在一个单独的静态类的任何好处?这样,它就不必检查静态Test
是否已初始化。[更新见下面我的回答,有一个更好,更简单的例子]。
static class Test {
// Static constructor with dependent method:
static int x;
static Test() { x = 5; }
static int Dependent() { return x; }
// Static, independent method:
static int Independent(int y) { return y+1; }
}
下面是c#规范中关于静态构造函数的引用:
静态构造函数的执行由以下事件将在应用程序域中发生:
- 创建一个类的实例。
- 类的静态成员被引用。
由于缺乏答案,在@Jobo的指导下,我决定亲自测试一下。
下面是我的测试类:
static class WithConstructor {
static WithConstructor(){ }
public static int Square(int x){ return x*x; }
}
static class NoConstructor {
public static int Square(int x){ return x*x; }
}
为发行版编译,使用。net 4.0,结果非常一致:<>之前╔═════════════╦══════════════════╦═════════╦═══════════════╗使用构造函数迭代:使用构造函数迭代# # # # # # # # # #╚═════════════╩══════════════════╩═════════╩═══════════════╝之前
因此,我将回答我自己的问题:
如果存在静态构造函数,那么静态方法将导致(微小的)性能损失,因为必须始终检查
beforefieldinit
标志。如果静态构造函数不存在,那么该方法将不会导致性能下降。
为什么不自己测试一下呢?
像上面指定的那样多次调用独立方法。然后用相同的方法创建一个自己的静态类,并调用它相同的次数。使用http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx进行测量。
我猜这不会有什么影响…
你也可以在你的静态构造函数中写一些东西给Console来检查是否被调用。自己去寻找答案会比一些理论答案更持久,只是我的两分意见。
静态构造函数会降低第一个方法调用者的性能。实际上,将第一个调用者更改为测试是否已经调用了静态构造函数,但其他调用者是否不受影响。