静态构造函数可以降低访问静态方法的性能吗?

时间:2011-11-15 06:46:42

标签: c# .net performance static static-constructor

第一次访问静态成员时会执行静态构造函数。知道了这一点,我有几个问题:

  • 这是否意味着每次访问静态方法时,运行时必须检查是否已调用静态构造函数?
  • 这是否会影响性能?
  • “无构造函数”静态类是否可以避免这种性能损失?

[编辑] :我想澄清一点,我并不关心微优化。
我问这个问题,因为这是一个设计决定。如果静态构造函数导致性能损失,那么我将考虑到这一点设计我的代码,并且将更加了解可能影响性能的决策。

这是一个例子来说明我的问题。使用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#规范中的

Here's the quote

  

静态构造函数的执行由第一个触发   以下事件发生在应用程序域中:

     
      
  • 创建了一个类的实例。
  •   
  • 引用该类的任何静态成员。
  •   

3 个答案:

答案 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,第一个调用者被更改为测试是否已经调用了静态构造函数,但是如果没有影响则调用其他调用者。