1

我在本书作者中读了一本书(CLR via c#),谈到了 IL 和托管模块,托管模块在本机 cpu 代码中编译,然后在本书作者中执行说托管模块比非托管模块快。我的问题是为什么托管模块比非托管模块更快,但在托管模块中首先编译为 IL,然后在本机 cpu 中编译。

4

1 回答 1

1

(我下面写的不是我的,是从一本书上复制粘贴的CLR via C#, Page No 14:)


托管代码的性能优于非托管代码的原因有很多

当 JIT 编译器在运行时将 IL 代码编译为本机机器代码时,编译器对执行环境的了解比非托管编译器要多。

托管代码可以胜过非托管代码的一些方法

  • JIT 编译器可以确定应用程序是否在 Intel Pentium 4 CPU 上运行,并生成利用 CPU 提供的任何特殊指令的本机代码。通常,非托管应用程序针对 CPU 的最小公分母进行编译,并避免使用会提高应用程序性能的特殊指令。
  • JIT 编译器可以确定某个测试在运行它的机器上何时总是失败。考虑这个例子

    if (num_of_cpu > 1)
    {        
    }
    

如果机器只有一个 CPU,此代码会导致 JIT 不生成任何 CPU 指令。

  • CLR 可以分析代码的执行情况,并在应用程序运行时将 IL 重新编译为本机代码。根据观察到的执行模式,将重新组织重新编译的代码以减少不正确的分支预测。当前版本的 C# 不这样做,但未来版本可能会。
于 2013-02-04T19:30:14.463 回答