21

我想知道预 JIT 编译 (ngen.exe) 的好处。本机图像生成器(NGen) 进程的作用是什么,为什么需要它?

请举个例子。

4

4 回答 4

32

为了在 .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 运行时优化服务自动完成的。

于 2014-02-05T03:28:06.427 回答
7

.NET 编译流程

当 .NET 编译器编译 C# 或 VB.NET 代码时,它会编译它们的一半并创建CIL代码。当您运行这个半编译的 .NET EXE 文件时,JIT 在后台运行并将半 CIL 代码编译成完整的机器语言。这种模式称为正常 JIT。

您也可以通过运行完整编译的 EXE 文件来反过来说您不想要运行时编译。此编译是通过使用 negen.exe 完成的。在这种情况下,JIT 在运行时不参与。这被称为预 JIT 模式。

如果您想了解它们如何影响性能,您可以观看此 YouTube 视频,该视频演示了正常 JIT 和预 JIT 编译模式:

解释 JIT、Ngen.exe、Pre-jit、Normal-Jit 和 Econo-Jit。?(.NET 面试题)

于 2014-04-18T05:17:12.547 回答
2

根据MSDN

本机映像生成器 (Ngen.exe) 是一种提高托管应用程序性能的工具。Ngen.exe 创建本机映像,这些文件包含已编译的特定于处理器的机器代码,并将它们安装到本地计算机上的本机映像缓存中。运行时可以使用缓存中的本机映像,而不是使用即时 (JIT) 编译器来编译原始程序集。

我过去在安装过程中使用过 NGEN,以便软件可以更快地启动。

于 2013-12-16T20:40:28.553 回答
2

NGen(本机图像生成器)基本上将 .NET 字节码 ( CIL ) 编译为运行它的计算机的本机代码。好处是,鉴于您不是每次都将代码编译为本机,您运行它或需要它,但您只执行一次,应用程序启动并运行得更快。如果您想了解更多信息,这里有大量关于 JIT 与 Ahead of Time Compilation(这是 NGen 所做的)的优势的资源。

于 2013-12-16T20:40:30.620 回答