我想知道预 JIT 编译 (ngen.exe) 的好处。本机图像生成器(NGen) 进程的作用是什么,为什么需要它?
请举个例子。
为了在 .NET 平台上执行代码,需要将通用中间语言(CIL) 表示形式转换为机器代码。如果这在执行之前立即发生,则称为 JIT(及时)编译。JIT 的输出不会持久化,因此您的托管应用程序每次启动都必须通过 JIT。
或者,您可以使用预编译来减少与 JIT 编译相关的启动开销。NGen 执行预编译并将本机映像保存在本机映像缓存中。然后应用程序可以使用本机映像运行,并且由于减少了 JIT 编译开销,可能会体验到更快的启动时间。最初,NGen 是一种安装时技术,开发人员让应用程序安装程序发出 NGen 命令以在安装时触发预编译。有关更多详细信息,请查看NGen 通过强大的新功能提升您的性能。本文提供了一个利用 NGen 的示例应用程序。
在 Windows 8 (.NET 4.5) 中,引入了新的 NGen 模式:“Auto NGen”。基本上,.NET 运行时会为托管应用程序生成使用日志。当系统空闲时,自动维护任务在后台运行并生成原生图像。这样,开发人员不再需要明确地处理 NGen。请注意,此功能仅适用于面向 Window Store 或使用GAC的 .NET 4.5+ 应用程序。这是一个可能有用的 MSDN 页面: Creating Native Images
这是对 NGen 和相关技术的高级概述: 需要速度吗?.NET 应用程序启动速度更快
最后,.NET 框架库本身使用 NGen 以获得更好的性能。为 .NET 框架提供服务时,一些本机图像会失效。然后 NGen 需要运行重新生成无效的原生镜像。这是通过在空闲时间运行的 .NET 运行时优化服务自动完成的。
当 .NET 编译器编译 C# 或 VB.NET 代码时,它会编译它们的一半并创建CIL代码。当您运行这个半编译的 .NET EXE 文件时,JIT 在后台运行并将半 CIL 代码编译成完整的机器语言。这种模式称为正常 JIT。
您也可以通过运行完整编译的 EXE 文件来反过来说您不想要运行时编译。此编译是通过使用 negen.exe 完成的。在这种情况下,JIT 在运行时不参与。这被称为预 JIT 模式。
如果您想了解它们如何影响性能,您可以观看此 YouTube 视频,该视频演示了正常 JIT 和预 JIT 编译模式:
根据MSDN:
本机映像生成器 (Ngen.exe) 是一种提高托管应用程序性能的工具。Ngen.exe 创建本机映像,这些文件包含已编译的特定于处理器的机器代码,并将它们安装到本地计算机上的本机映像缓存中。运行时可以使用缓存中的本机映像,而不是使用即时 (JIT) 编译器来编译原始程序集。
我过去在安装过程中使用过 NGEN,以便软件可以更快地启动。