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

时间:2010-12-15 02:33:43

标签: c# .net performance extension-methods

我刚刚遇到this 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在预热时会做什么)?如果这个方法是扩展方法(静态方法),那么一切都是一样的吗?

4 个答案:

答案 0 :(得分:7)

如果通过“热身”你指的是JIT'ing那么是 - 如果一个方法永远不会被调用它将不会被编译,所以你第一次运行它可能会更慢。 另请参阅Does the .NET CLR JIT compile every method, every time?

答案 1 :(得分:6)

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

答案 2 :(得分:4)

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

如果您真的想要,可以预先编译为特定于平台的版本。

答案 3 :(得分:3)

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

来自 Compiling MSIL to Native Code

  

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