为什么托管模块比C#中的非托管模块更快?

时间:2013-02-04 19:15:35

标签: c# performance compiler-construction il

我在书中写了一本书(CLR通过c#)讲述了IL和托管模块,托管模块在本机cpu代码中进行编译,然后在书中执行写作说托管模块比非托管模块更快。我的问题是为什么Managed模块比Unmanaged模块更快但是在Managed模块中首先编译为IL然后在本机cpu中编译。

1 个答案:

答案 0 :(得分:1)

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


托管代码可以胜过非托管代码

的原因有很多
  

当JIT编译器将IL代码编译为本机代码时   运行时,编译器比执行环境更了解   非托管编译器会知道。

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

  • JIT编译器可以确定应用程序是否正在运行 英特尔奔腾4 CPU并生成利用其优势的本机代码 CPU提供的任何特殊指令通常,不受管理 应用程序是为CPU的最低公分母编译的 并避免使用可提供应用的特殊指令 性能提升。
  • JIT编译器可以确定某个测试何时始终在运行它的计算机上失败。考虑一下这个例子

    if (num_of_cpu > 1)
    {        
    }
    

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

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