比方说,如果我的代码总是在特定的处理器上运行,如果我在安装过程中获得了这些信息-我是否有机会避免JIT?
发布于 2009-01-15 02:54:10
如果您在安装时有CPU信息,则不必避免JIT。
如果使用/platform:x86/x64/IA64开关编译模块,编译器将在生成的PE文件中包含此信息,以便CLR将代码JIT到适当的CPU本机代码中,并针对该CPU体系结构优化代码。
你可以使用NGEN,但是只有当你想通过减少运行进程中的工作集来改善应用程序的启动,而不是因为你会避免使用JITting。您需要实际比较NGEN'd文件和非NGEN'd文件的性能,以确保NGEN‘d文件更快。
NGEN不能像JIT编译器那样对执行环境做出太多假设,因此将产生未优化的代码。
例如:它为静态字段访问添加了间接性,因为静态字段的实际地址只有在运行时才知道。
发布于 2009-01-15 02:04:28
使用NGEN
本机图像生成器(Ngen.exe)
是一种可提高托管应用程序性能的工具。Ngen.exe创建本机映像,并将其安装到本地计算机上的本机映像缓存中。运行库可以使用缓存中的本机映像,而不是使用实时(JIT)编译器来编译原始程序集……
有关使用Ngen.exe和本机映像服务的其他信息,请参阅Native Image Service。
发布于 2009-03-10 20:49:52
NGEN是显而易见的答案,但我要指出的是,JIT-ed代码可以更快,因为它在运行时“知道”NGEN不能知道的事情。我们使用这一事实在运行时根据.config文件中的设置直接将代码行放在地板上:
static readonly bool _EnableLogging = LoadFromConfigFile("EnableLogging");
if (_EnableLogging && log.IsDebugEnabled)
{
//Do some logging
}
在本例中,NGEN必须在代码中保留if语句,因为它不知道_EnableLogging字段的值是什么。然而,JIT确实知道这次运行的值,如果它为false,那么就不可能处理if语句,并且JIT将从它生成的机器代码中完全省略整个if语句,从而导致代码库更小,从而代码库更快。
https://stackoverflow.com/questions/446211
复制