如果我们有 NGEN 为什么要 JIT

Why JIT if we have NGEN

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

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

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

当 NGEN 或 AOT 适合时:太好了,去做吧。但这并不是解决所有问题的魔杖。

One more question, how JIT will complie IL code if it is already NGENed?

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

This post 解释了为什么 NGEN 可能不像听起来那么有吸引力。

并且 here Microsoft 有非常古老的建议何时使用 NGEN

One more question, how JIT will complie IL code if it is already NGENed?

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