我刚刚遇到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在预热时会做什么)?如果这个方法是扩展方法(静态方法),那么一切都是一样的吗?
答案 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-编译并运行代码。