我可以在.net中避免使用JIT吗?

Ses*_*esh 5 .net jit

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

Iga*_*ban 13

使用NGEN:

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

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


Wal*_*ich 11

NGEN是一个明显的答案,但我要指出,JIT编码可以更快,因为它"知道"运行时NGEN无法做到的事情.我们使用这个事实在运行时根据.config文件中的设置逐字地丢弃代码行:

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

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

  • 实际上,JIT确实知道,我刚才给出了一个不完整的例子.静态只读是一个类级变量,所以它是在类创建时加载的,if()在方法中是w /所以它在生命的后期是JIT.我确信使用windbg将代码丢弃在地板上并在我们执行此操作时逐步执行生成的机器代码. (3认同)
  • 我知道这个答案现在有点老了,但我不相信这是正确的.只有在运行代码时才会知道`_EnableLogging`.JIT编译器正在尝试编译IL代码,因此*可以*运行.如果它是`true` /`false`,它将不会执行代码,因此将按原样编译`if`块. (2认同)

Lon*_*nzo 6

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

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

你可以使用NGEN,是的,但只有当你想要改进应用程序的启动时,由于运行过程中减少了工作集而不是你本可以避免JITting.您需要实际比较NGEN文件的性能与非NGEN文件的性能,以确保NGEN的文件更快.

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

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