为什么 C# 中的托管模块比非托管模块更快 [已关闭]

问题描述 投票:0回答:1

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

c# performance cil
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# 不这样做,但未来的版本可能会这样做。
© www.soinside.com 2019 - 2024. All rights reserved.