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

C# 静态构造函数会降低访问静态方法的性能吗?,c#,.net,performance,static,static-constructor,C#,.net,Performance,Static,Static Constructor,静态构造函数在您第一次访问静态成员时执行。知道这一点,我有几个问题: 这是否意味着每次访问静态方法时,运行时都必须检查静态构造函数是否已被调用 这会导致性能下降吗 “无构造函数”静态类能避免这种性能损失吗 [编辑]:我想澄清一下,我不关心微观优化。 我问这个问题是因为这是一个设计决定。如果静态构造函数导致性能下降,那么我将在设计代码时牢记这一点,并将更加注意可能影响性能的决策 这里有一个例子来说明我的问题。采用独立的方法并将其放在单独的静态类中有什么好处吗?这样,它就不必检查staticTe

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

  • 这是否意味着每次访问静态方法时,运行时都必须检查静态构造函数是否已被调用
  • 这会导致性能下降吗
  • “无构造函数”静态类能避免这种性能损失吗
[编辑]:我想澄清一下,我不关心微观优化。
我问这个问题是因为这是一个设计决定。如果静态构造函数导致性能下降,那么我将在设计代码时牢记这一点,并将更加注意可能影响性能的决策

这里有一个例子来说明我的问题。采用
独立的
方法并将其放在单独的静态类中有什么好处吗?这样,它就不必检查static
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#规范:

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

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

为什么不自己测试一下呢

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

用于测量

我猜这没关系

您还可以在静态构造函数中向控制台写入一些内容,以检查是否已调用。
自己找出答案比理论上的答案持续的时间更长,只有我的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
    标志

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


静态构造函数会降低第一个方法调用方的性能。Indead,第一个调用方被更改为测试静态构造函数是否已被调用,但如果未被影响,则测试另一个调用方。

可能重复:我读了那篇文章,但它肯定与我的问题不同。它比较了类型初始化和静态构造函数的性能。我想知道静态构造函数是否会减慢对方法的访问。我重新阅读了“副本”,包括所有答案和链接,但仍然没有我的问题的答案!我认为这是字段访问,而不是方法调用。但是,是的,在某些情况下,性能会明显降低。@Henkholtman我通常批评过早优化。然而,我更感兴趣的是开发好的设计模式,如果已知静态构造函数会导致性能下降,那么设计可能导致性能下降的静态方法不是一个很好的实践。我想我会的。我真的很惊讶没有一个众所周知的答案。@Scott没有一个众所周知的答案,因为这很可能不是任何人的瓶颈。甚至有可能删除该构造函数,而将默认值X设置为5。@Rangoric我在我的OP中没有提到这一点(现在在这里),但我对性能的兴趣不如对设计决策的兴趣。在设计静态方法时,理解可能的性能影响肯定会有所帮助,在这种情况下,拥有良好的设计模式将有助于避免这些影响。