5

假设我的代码是否总是要在特定处理器上运行,如果我在安装过程中有这些信息 - 我有机会避免 JIT 吗?

4

3 回答 3

13

使用NGEN

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

有关使用 Ngen.exe 和本机映像服务的其他信息,请参阅本机映像服务...

于 2009-01-15T10:04:27.930 回答
11

NGEN 是显而易见的答案,但我要指出的是,JIT 编辑的代码可以更快,因为它在运行时“知道”NGEN 无法做到的事情。我们利用这个事实在运行时根据我们的 .config 文件中的设置将代码行放在地板上:

static readonly bool _EnableLogging = LoadFromConfigFile("EnableLogging");
if (_EnableLogging && log.IsDebugEnabled)
{
   //Do some logging
}

在此示例中,NGEN 必须在代码中保留 if 语句,因为它不知道 _EnableLogging 字段的值是什么。但是,JIT 确实知道运行的值,如果它为 false,则永远不会处理 if 语句,并且 JIT 会从它生成的机器代码中逐字省略整个 if 语句,从而导致代码库更小,因此更快的代码库。

于 2009-03-11T04:49:51.730 回答
6

如果您在安装时有 CPU 信息,则不必避免 JIT。

如果您使用 /platform:[x86/x64/IA64] 开关编译模块,编译器将在生成的 PE 文件中包含此信息,以便 CLR 将代码 JIT 到适当的 CPU 本机代码并为此优化代码CPU 架构。

您可以使用NGEN,是的,但前提是您想改善应用程序的启动,因为正在运行的进程中的工作集减少,而不是因为您会避免 JITting。您需要将 NGEN 文件的性能与非 NGEN 文件的性能进行实际比较,以确保 NGEN 文件更快。

NGEN 不能像 JIT 编译器那样对执行环境做出尽可能多的假设,因此会产生未优化的代码。

例如:它为静态字段访问添加了间接访问,因为静态字段的实际地址仅在运行时才知道。

于 2009-01-15T10:54:10.200 回答