假设我的代码是否总是要在特定处理器上运行,如果我在安装过程中有这些信息 - 我有机会避免 JIT 吗?
3 回答
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 语句,从而导致代码库更小,因此更快的代码库。
如果您在安装时有 CPU 信息,则不必避免 JIT。
如果您使用 /platform:[x86/x64/IA64] 开关编译模块,编译器将在生成的 PE 文件中包含此信息,以便 CLR 将代码 JIT 到适当的 CPU 本机代码并为此优化代码CPU 架构。
您可以使用NGEN,是的,但前提是您想改善应用程序的启动,因为正在运行的进程中的工作集减少,而不是因为您会避免 JITting。您需要将 NGEN 文件的性能与非 NGEN 文件的性能进行实际比较,以确保 NGEN 文件更快。
NGEN 不能像 JIT 编译器那样对执行环境做出尽可能多的假设,因此会产生未优化的代码。
例如:它为静态字段访问添加了间接访问,因为静态字段的实际地址仅在运行时才知道。