6

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

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

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

这是一个例子来说明我的问题。Independent采用该方法并将其放在单独的静态类中会有什么好处吗?这样,它就不必检查 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# 规范中关于静态构造函数的引用

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

  • 类的一个实例被创建。
  • 类的任何静态成员都被引用。
4

3 回答 3

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; }
}

为Release编译,使用.NET 4.0,结果非常一致:

╔═════════════╦══════════════════╦═════════╦══════ ═════════╗
║ 迭代: ║ 使用构造函数 ║ 4513 ms ║ 改进: ║
║ 1000000000 ║ 无构造函数 ║ 3072 毫秒 ║ 33% ║
╚═════════════╩══════════════════╩═════════╩══════ ═════════╝

因此,我将回答我自己的问题:

  • 如果存在静态构造函数,则静态方法将导致(微观)性能损失,因为beforefieldinit必须始终检查标志。

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

于 2011-11-15T20:30:24.637 回答
2

为什么不自己测试呢?

像上面指定的那样多次调用您的 Independent 方法。然后用相同的方法创建一个自己的静态类并调用相同的次数。

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

我的猜测是没关系...

您还可以在静态构造函数中向 Console 写入一些内容,以检查是否已被调用。自己找出答案会比一些理论答案持续更长时间,只是我的 2 美分。

于 2011-11-15T09:52:26.850 回答
0

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

于 2015-01-05T18:08:55.747 回答