如果我们有NGEN,为什么选择JIT

时间:2017-06-01 09:16:15

标签: .net clr jit ngen

为什么CLR需要JIT编译器将IL编译为机器代码,因为它具有NGEN,在安装时可以正常工作。

还有一个问题,如果JIT代码IL已经NGENed,它将如何编译?{/ p>

2 个答案:

答案 0 :(得分:3)

  • 因为很多应用都没有安装"从这个意义上讲,并没有利用NGEN所需的结构;它们只是存储设备上的文件(或纯粹在内存中,如果从外部源加载)
  • 因为NGEN与硬件捆绑在一起,而硬件可以在机器的生命中更改
  • 因为JIT本身可以单独更新到您的应用程序,修复错误并提高性能
  • 因为应用程序使用插件和扩展点等内容; NGEN
  • 时,一切可能都无法使用
  • 因为许多应用程序使用元编程在运行时基于确切的条件为自己发出优化的代码(可能是外部数据在运行时实际调用之前不可知) - ORMs如何映射数据库列到对象,例如)
  • 因为在很多情况下不值得NGEN的开销 - 它不会改善事情

当NGEN或AOT很合适时:太棒了,那就去做吧。但它并不是解决每一个问题的魔杖。

  

还有一个问题,如果已经NGEN,JIT将如何编译IL代码?

假设NGEN图像的所有前提条件都是完美匹配,那么JIT就不需要参与。

答案 1 :(得分:1)

This post有一些解释为什么NGEN可能没有听起来那么吸引人。

here来自 Microsoft 的建议很晚,何时使用NGEN

  

还有一个问题,如果IL代码已经被NGEN化,那么JIT将如何编译IL代码?

如果运行时决定需要重新编译 - 它将完全忽略NGENed图像。