2011-11-15 104 views
6

第一次访问静态成员时会执行一个静态构造函数。知道这个,我有几个问题:静态构造函数可以降低访问静态方法的性能吗?

  • 这是否意味着每次访问静态方法时,运行时都必须检查静态构造函数是否已被调用?
  • 这是否会导致性能下降?
  • 做“无构造函数”的静态类可以避免这种性能下降吗?

[编辑]:我想澄清一点,我不关心微观优化。
我在问这个问题,因为它是设计的决定。如果一个静态构造函数导致性能下降,那么我会根据这个设计我的代码,并且会更加意识到可能影响性能的决定。

下面是一个例子来说明我的问题。采取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; } 
} 

Here's the quote约静态构造的C#规格:

静态构造的执行是由第一 以下事件到应用程序域内发生触发:

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

可能的重复:http://stackoverflow.com/questions/2921828/static-constructors-cause-a-performance-over-head –

+0

我读过这篇文章,但它绝对不同于我的问题。它比较了**类型初始化** vs **静态构造函数**的性能。我有兴趣知道访问方法是否被静态构造函数放慢了。我重新阅读“重复”,包括所有答案和链接,但仍然没有答案给我的问题! –

+0

我认为这是在字段访问而不是方法调用。但是,是的,在某些情况下可以显着降低性能。 – CodesInChaos

回答

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标志。

  • 如果静态构造函数不存在,那么该方法不会导致性能下降。

2

为什么不自己测试一下?

按照上面指定的次数调用您的独立方法。 然后用相同的方法创建一个自己的静态类并将其称为相同的次数。

使用http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx进行测量。

我的猜测是它事不需额外...

你也可以写的东西在你的静态构造控制台,以检查是否已被调用。 寻找自己将持续更长的时间比一些理论上的答案,只是我的2美分。

+0

我想我会的。我很惊讶没有一个众所周知的答案。 –

+0

@斯科特没有一个众所周知的答案,因为这很可能不是任何人的瓶颈。甚至有一个机会,它删除该构造函数,而是默认X的值为5. – Rangoric

+0

@Rangoric我没有在我的OP中提到这个(它现在在那里),但我对性能不如我感兴趣我在设计决定。当设计一个静态方法时,它肯定有助于理解可能的性能命中,在这种情况下,具有良好的设计模式将有助于避免这些命中。 –

0

静态构造函数可以降低第一个方法调用者的性能。 Indead,第一个调用者更改为测试静态构造函数是否已被调用,但其他调用者是否不受影响。

相关问题