C# 使用和不使用静态构造函数的静态类型性能

C# 使用和不使用静态构造函数的静态类型性能,c#,.net,C#,.net,Jon Skeet在“性能与懒惰”一段中关于单身汉的文章中写道: 如果您的单例实例是在一个相对较紧的 循环,这会产生(相对)显著的性能差异 据我所知,他指的是两种情况之间的区别:有静态构造函数和没有静态构造函数 但这种差异的原因对我来说仍然很模糊,尽管有这样的话: 这可以提高性能,因为它允许JIT编译器 单次检查(例如在方法开始时)以确保 类型已初始化,然后从那时起假定它 若静态构造函数存在,JIT编译器做什么 Jon Skeet实际上是指当您创建singleton对象的实例时。如果您在静态构造

Jon Skeet在“性能与懒惰”一段中关于单身汉的文章中写道:

如果您的单例实例是在一个相对较紧的 循环,这会产生(相对)显著的性能差异

据我所知,他指的是两种情况之间的区别:有静态构造函数和没有静态构造函数

但这种差异的原因对我来说仍然很模糊,尽管有这样的话:

这可以提高性能,因为它允许JIT编译器 单次检查(例如在方法开始时)以确保 类型已初始化,然后从那时起假定它


若静态构造函数存在,JIT编译器做什么

Jon Skeet实际上是指当您创建singleton对象的实例时。如果您在静态构造函数中创建它,那么框架将确保它只执行一次,并且不需要取出锁

但是,如果在第一次访问实例时使用Lazy或使用一些自定义代码来生成实例,则速度可能会较慢


他说,如果在循环中访问singleton实例,那么静态构造函数将更快。

这两种方法的性能没有太大差异。除非你打电话给他们的时候很紧张

singleton和静态类的最大区别在于singleton可以实现接口。您可以将singleton类作为参数传递

编辑



除非你打电话给他们

单例实例变量的速度较慢,因为您必须访问两个内存操作才能获得该值

  • 静态存储

  • 和正常的内存存储

    但对于一个普通的电话来说,差别可以忽略不计。当您在一个巨大的循环中调用它时,这种差异将会增加,在这种情况下,静态类的性能会更好


  • 我从中找到了关于性能的答案

    当类型声明显式静态构造函数时,即时 (JIT)编译器向每个静态方法和实例添加一个检查 类型的构造函数,以确保静态构造函数 以前叫过。当出现任何静态错误时,将触发静态初始化 成员,或者在创建该类型的实例时。 但是,如果声明 变量的类型,但不要使用它,如果 初始化更改全局状态。当所有静态数据 已初始化内联且未声明显式静态构造函数, Microsoft中间语言(MSIL)编译器添加 beforefieldinit标志和隐式静态构造函数 将静态数据初始化为MSIL类型定义。当JIT 编译器遇到beforefieldinit标志,大多数情况下 不添加静态构造函数检查。静态初始化是 保证在访问任何静态字段之前的某个时间发生 但不是在调用静态方法或实例构造函数之前。 请注意,静态初始化可以在变量之后的任何时间发生 已声明类型的


    我不确定,因为在“第四个版本-不太懒惰,但不使用锁的线程安全”的部分中,他写道:“还要注意,它会影响性能,正如在页面底部讨论的那样。”但是这个示例不包含锁或懒惰。“除非你在一个紧密的循环中调用它们”-然后会发生什么?仍然不清楚。比什么慢?文章中给出的任何一个例子都暗示了这两个操作,不是吗?比什么慢??我们只讨论两种类型,对吗?我所说的是,单态比静态慢