在C#中调用方法时的预热

我刚看到这篇关于时间测量的post 。 我记得(我希望我没有记错)这是一场不公平的比赛,如果以前从未打过这种方法的话。 那是:

// At the beginning of the application MyClass instance = new MyClass(); instance.MyMethod(); instance.MyMethod(); // Faster than the first call, because now it's warmed up. 

我们真的在C#中有这样的热身理论吗? 如果是,为什么(热身时CLR会做什么)? 如果这个方法是扩展方法(静态方法),那么一切都是一样的吗?

如果通过“热身”你指的是JIT’ing那么是 – 如果一个方法永远不会被调用它将不会被编译,所以你第一次运行它可能会更慢。 另请参阅.NET CLR JIT每次都编译每种方法吗?

这是由于即时(JIT)编译。 如果您想提高性能并避免这种影响, Native Image Generator (Ngen.exe)可以为您提供帮助。

人们在这里谈论的是即时编译 。 您在.NET中创建的代码以中间语言存储,这与平台无关。 当您运行应用程序时, CIL代码的部分内容将编译为特定于平台的指令,这些指令在第一次使用时需要一些时间。 然后它被缓存,所以下次你调用方法时你没有这个时间损失。

如果你真的想要,你可以预编译到平台特定的版本。

它需要编译,这就是第一次调用更长的原因。

编译MSIL到本机代码

在对方法的初始调用中,存根将控制传递给JIT编译器,JIT编译器将该方法的MSIL转换为本机代码,并修改存根以将执行直接执行到本机代码的位置。 后续调用JIT编译的方法直接进入以前生成的本机代码,减少了JIT编译和运行代码所需的时间。