Ngen和RyuJIT在.NET 4.6下是两个完全不相关的东西(特别是使用不同的优化技术和算法)?
如果我们不关心自我评估和/或冷/热启动时间的成本,那么什么产生最快(更优化)的x64本机代码呢?
我们正在运行一个长期运行的服务器应用。连续运行阶段在性能方面非常重要。 (预)启动阶段对我们来说并不重要。到目前为止,我们已经使用.NET 4.5并且始终由Ngen生成本机映像。 我们现在正在升级到.NET 4.6,我们希望确保这不会降低我们持续运行阶段的性能。我已经阅读了一些信息,RyuJIT是改善JITing时间的绝佳选择,但与Ngen相比,被引用的代码可能不那么优化 - 参见例如this github comment on one of the RyuJIT bugs。
答案 0 :(得分:11)
NGen和RyuJIT之间没有足够的区别让你开心。他们做非常不同的工作,提前NGen jits和RyuJIT在流程运行时及时进行。但NGen没有自己的抖动,它要求RyuJIT完成工作。生成的机器代码没有根本不同。有一些优化无法预先完成,NGen-ed代码稍慢。
技术上NGen可以做得更好,因为优化器可以花更多时间分析代码并尝试找到最佳的优化。但微软没有利用这一点。它不完全是水晶,为什么他们不会,但肯定与他们的1-800支持电话号码有关。代码优化始终是代码生成器中最危险的部分,现有抖动中的错误始终是优化错误。这可能会在某一天发生变化并不是不可想象的。
当你可以利用.NET Native时,你会领先。它使用C ++编译器的后端提前生成代码。但是目前,肯定会在相当长的一段时间内,它只支持打包的应用程序。通过Windows应用商店提供的类型,您必须以Store,Phone或Universal为目标,并使用Store作为部署工具。该软件包对于使.NET Native工作非常重要,只有它才能看到需要翻译的代码。而且它通常仍然需要帮助来实现正确,反射是一个难以解决的问题,也就是你在机器上拥有它的原因。请注意,NGen不存在相同的问题,它仍然依赖于抖动来及时获取某些代码。像反射目标代码和泛型。这可能会在某一天发生变化并不是不可想象的。
如上所述,NGen代码稍慢。因此,如果您不关心热启动延迟,那么您不想使用NGen。
最后但并非最不重要的是,RyuJIT 不生成的代码比其前任更快。这已经做了非常好的优化工作。太体面了。 RyuJIT项目开始修复传统x64抖动中的问题,这种问题在代码库中非常基础,只能通过大幅重写才能解决。优化就是其中之一,它在花费的时间上没有上限。在大型方法上给予非常不合理的jitting时间。因此,如果你想挤压最后一盎司然后故意禁用RyuJIT,那么你应该尝试回归传统的x64抖动。