c# - Ngen vs RyuJIT - 在(预)启动无关紧要时最快的 x64 运行代码

标签 c# .net jit ngen ryujit

Ngen 和 RyuJIT 是.NET 4.6 下两个完全不相关的东西吗(尤其是不同的优化技术和算法)?

如果我们不关心 jitting 本身的成本和/或冷/热启动时间,什么能产生最快(更好优化)的 x64 native 代码?

我们正在运行一个长时间运行的服务器应用程序。连续运行阶段在性能方面非常重要。 (预)启动阶段对我们来说并不重要。到目前为止,我们一直在使用 .NET 4.5,并且始终由 Ngen 生成 native 图像。 我们现在正在升级到 .NET 4.6,我们希望确保这不会降低我们持续运行阶段的性能。我已经阅读了一些信息,表明 RyuJIT 是改善 JITing 时间的绝佳选择,但与 Ngen 相比,jited 代码的优化程度较低 - 参见例如this github comment on one of the RyuJIT bugs .

最佳答案

NGen 和 RyuJIT 之间没有足够的差异让您满意。他们做非常不同的工作,NGen 提前 jit,而 RyuJIT 在进程运行时及时 jit。但是 NGen 没有自己的抖动,它要求 RyuJIT 来完成工作。生成的机器代码并没有根本的不同。有一些优化无法预先完成,NGen-ed 代码稍慢。

从技术上讲,NGen 可以做得更好,因为优化器可以花更多时间分析代码并尝试找到可能的最佳优化。但微软并没有利用这一点。他们为什么不这样做并不完全清楚,但肯定与他们的 1-800 支持电话号码有关。代码优化始终是代码生成器中风险最大的部分,现有抖动中的错误一直是优化错误。这可能有一天会改变并非不可想象。

当您可以利用 .NET Native 时,您就领先了。它使用 C++ 编译器的后端提前生成代码。但是目前,并且肯定会在未来相当长一段时间内,它只支持打包的应用程序。通过 Windows 应用商店交付的那种,您必须将应用商店、电话或通用应用程序作为目标,并将应用商店用作部署工具。该包对于使 .NET Native 工作非常重要,只有这样才能看到需要翻译的代码。而且它通常仍然需要帮助才能正确处理,反射是一个很难解决的问题,这就是你在你的机器上安装它的原因。请注意,NGen 不存在同样的问题,它仍然依赖于抖动来让一些代码及时抖动。像反射目标代码和泛型。这可能有一天会改变并非不可想象。

如前所述,NGen 代码稍慢。因此,如果您不关心热启动延迟,那么您就不想使用 NGen。

最后但同样重要的是,RyuJIT 确实不会生成比其前身更快的代码。这已经做了非常不错的优化工作。太体面了。 RyuJIT 项目开始修复遗留 x64 抖动中的问题,这种问题在代码库中非常基础,只能通过大幅重写来解决。优化就是其中之一,它对花在这上面的时间没有上限。在大型方法上给它非常不合理的 jitting 时间。因此,如果您想榨取最后一盎司,那么您应该尝试有意禁用 RyuJIT 以使其回落到传统的 x64 抖动。

关于c# - Ngen vs RyuJIT - 在(预)启动无关紧要时最快的 x64 运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33647502/

相关文章:

c# - 如何在 C# 中结束中断线程

.net - 右键单击选择 datagridview 行

c# - 添加/删除声音设备后,如何在NAudio中选择正确的声音输出设备?

Java 优化 : (Hotspot/Dalvik) Optimization of final method returning a constant?

java - 空闲后 JVM JIT 去优化

c# - 将具体类型转换为泛型类型?

c# - 帮助分析软件/程序如何构建贝塞尔曲线

c - 在解释器创建方面需要一些指导

c# - 嵌入式资源文件的路径

c# - 读\写结构化二进制文件