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

本文关键字:性能 静态方法 访问 构造函数 静态 | 更新日期: 2023-09-27 18:14:53

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

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

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

这里有一个例子来说明我的问题。是否有采取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#规范中关于静态构造函数的引用:

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

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

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

由于缺乏答案,在@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,结果非常一致:<>之前╔═════════════╦══════════════════╦═════════╦═══════════════╗使用构造函数迭代:使用构造函数迭代# # # # # # # # # #╚═════════════╩══════════════════╩═════════╩═══════════════╝之前

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

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

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

为什么不自己测试一下呢?

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

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

我猜这不会有什么影响…

你也可以在你的静态构造函数中写一些东西给Console来检查是否被调用。自己去寻找答案会比一些理论答案更持久,只是我的两分意见。

静态构造函数会降低第一个方法调用者的性能。实际上,将第一个调用者更改为测试是否已经调用了静态构造函数,但其他调用者是否不受影响。