第一次访问静态成员时会执行静态构造函数。知道了这一点,我有几个问题:
[编辑] :我想澄清一点,我并不关心微优化。
我问这个问题,因为这是一个设计决定。如果静态构造函数导致性能损失,那么我将考虑到这一点设计我的代码,并且将更加了解可能影响性能的决策。
这是一个例子来说明我的问题。使用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#规范中的
静态构造函数的执行由第一个触发 以下事件发生在应用程序域中:
- 创建了一个类的实例。
- 引用该类的任何静态成员。
答案 0 :(得分:7)
由于缺乏答案,并且在@ 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编译发布,结果非常一致:
╔═════════════╦══════════════════╦═════════╦═══════════════╗ ║ Iterations: ║ With Constructor ║ 4513 ms ║ Improvement: ║ ║ 1000000000 ║ No Constructor ║ 3072 ms ║ 33% ║ ╚═════════════╩══════════════════╩═════════╩═══════════════╝
因此,我将回答我自己的问题:
如果存在静态构造函数,则静态方法将导致(微观)性能损失,因为必须始终检查beforefieldinit
标记。
如果静态构造函数不存在,则该方法不会导致性能损失。
答案 1 :(得分:2)
为什么不亲自测试?
多次调用您的Independent方法,如上所述。 然后使用相同的方法创建一个自己的静态类,并将其调用相同的次数。
使用http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx进行测量。
我的猜测是无关紧要......
您还可以在静态构造函数中向控制台写入内容以检查是否已调用。 找出适合自己的时间比一些理论上的答案要长,只需2美分。
答案 2 :(得分:0)
静态构造函数可以降低第一个方法调用者的性能。 Indead,第一个调用者被更改为测试是否已经调用了静态构造函数,但是如果没有影响则调用其他调用者。