C# 静态构造函数会降低访问静态方法的性能吗?
静态构造函数在您第一次访问静态成员时执行。知道这一点,我有几个问题:C# 静态构造函数会降低访问静态方法的性能吗?,c#,.net,performance,static,static-constructor,C#,.net,Performance,Static,Static Constructor,静态构造函数在您第一次访问静态成员时执行。知道这一点,我有几个问题: 这是否意味着每次访问静态方法时,运行时都必须检查静态构造函数是否已被调用 这会导致性能下降吗 “无构造函数”静态类能避免这种性能损失吗 [编辑]:我想澄清一下,我不关心微观优化。 我问这个问题是因为这是一个设计决定。如果静态构造函数导致性能下降,那么我将在设计代码时牢记这一点,并将更加注意可能影响性能的决策 这里有一个例子来说明我的问题。采用独立的方法并将其放在单独的静态类中有什么好处吗?这样,它就不必检查staticTe
- 这是否意味着每次访问静态方法时,运行时都必须检查静态构造函数是否已被调用李>
- 这会导致性能下降吗李>
- “无构造函数”静态类能避免这种性能损失吗
我问这个问题是因为这是一个设计决定。如果静态构造函数导致性能下降,那么我将在设计代码时牢记这一点,并将更加注意可能影响性能的决策 这里有一个例子来说明我的问题。采用
独立的
方法并将其放在单独的静态类中有什么好处吗?这样,它就不必检查staticTest
是否已初始化。[更新请参阅下面我的答案,以获得更好、更简单的示例]
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#规范:
静态构造函数的执行由
在应用程序域中发生以下事件:
- 将创建该类的一个实例
- 将引用该类的任何静态成员
为什么不自己测试一下呢 像上面指定的那样多次调用独立方法。 然后用相同的方法创建一个自己的静态类,并调用相同的次数 用于测量 我猜这没关系 您还可以在静态构造函数中向控制台写入一些内容,以检查是否已调用。
自己找出答案比理论上的答案持续的时间更长,只有我的2美分。由于缺乏答案,在@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% ║
╚═════════════╩══════════════════╩═════════╩═══════════════╝
╔═════════════╦══════════════════╦═════════╦═══════════════╗
║ 迭代:║ 带构造函数║ 4513毫秒║ 改进:║
║ 1000000000║ 无构造函数║ 3072毫秒║ 33% ║
╚═════════════╩══════════════════╩═════════╩═══════════════╝
因此,我将回答我自己的问题:
- 如果存在静态构造函数,那么静态方法将导致(微观)性能下降,因为必须始终选中
标志beforefieldinit
- 如果静态构造函数不存在,那么该方法将不会导致性能下降