假如我的代码总是要在特定的处理器上运行,如果我在安装过程中有这些信息 - 我有没有机会避免使用JIT?
使用NGEN:
Native Image Generator(Ngen.exe)是一种可以提高托管应用程序性能的工具.Ngen.exe创建本机映像,这些映像是包含已编译的特定于处理器的计算机代码的文件,并将它们安装到本地计算机上的本机映像缓存中.运行时可以使用来自缓存的本机映像,而不是使用实时(JIT)编译器来编译原始程序集......
有关使用Ngen.exe和本机映像服务的其他信息,请参阅本机映像服务 ...
NGEN是一个明显的答案,但我要指出,JIT编码可以更快,因为它"知道"运行时NGEN无法做到的事情.我们使用这个事实在运行时根据.config文件中的设置逐字地丢弃代码行:
static readonly bool _EnableLogging = LoadFromConfigFile("EnableLogging"); if (_EnableLogging && log.IsDebugEnabled) { //Do some logging }
在此示例中,NGEN必须在代码中保留if语句,因为它不知道_EnableLogging字段的值是什么.但是,JIT确实知道了这个运行的值,如果它是假的,那么if语句就不会被处理,并且JIT将从它生成的机器代码中省略整个if语句,从而导致代码库更小,因此更快的代码库.
如果在安装时有CPU信息,则不必避免JIT.
如果使用/ platform:[x86/x64/IA64]开关编译模块,编译器将在生成的PE文件中包含此信息,以便CLR将代码JIT到适当的CPU本机代码中并优化代码CPU架构.
你可以使用NGEN,是的,但只有当你想要改进应用程序的启动时,由于运行过程中减少了工作集而不是你本可以避免JITting.您需要实际比较NGEN文件的性能与非NGEN文件的性能,以确保NGEN的文件更快.
NGEN不能像JIT编译器那样对执行环境做出尽可能多的假设,因此会产生未经优化的代码.
例如:它为静态字段访问添加了间接性,因为静态字段的实际地址仅在运行时才知道.