Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Ngen vs RyuJIT-在(预)启动时运行最快的x64代码并不重要_C#_.net_Jit_Ngen_Ryujit - Fatal编程技术网

C# Ngen vs RyuJIT-在(预)启动时运行最快的x64代码并不重要

C# Ngen vs RyuJIT-在(预)启动时运行最快的x64代码并不重要,c#,.net,jit,ngen,ryujit,C#,.net,Jit,Ngen,Ryujit,在.NET4.6下,Ngen和RyuJIT是两个完全不相关的东西吗(特别是使用不同的优化技术和算法) 如果我们不关心jitting本身的成本和/或冷/热启动时间,那么什么会产生最快(优化程度更好)的x64本机代码 我们正在运行一个长期运行的服务器应用程序。连续运行阶段在性能方面非常重要。(启动前)阶段对我们来说并不重要。到目前为止,我们一直使用.NET4.5,并且总是由Ngen生成本机映像。 我们现在正在升级到.NET4.6,我们希望确保这不会降低连续运行阶段的性能。我已经阅读了一些信息,Ryu

在.NET4.6下,Ngen和RyuJIT是两个完全不相关的东西吗(特别是使用不同的优化技术和算法)

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

我们正在运行一个长期运行的服务器应用程序。连续运行阶段在性能方面非常重要。(启动前)阶段对我们来说并不重要。到目前为止,我们一直使用.NET4.5,并且总是由Ngen生成本机映像。
我们现在正在升级到.NET4.6,我们希望确保这不会降低连续运行阶段的性能。我已经阅读了一些信息,RyuJIT是提高JIT时间的最佳选择,但JIT代码与Ngen相比优化程度较低,请参见示例

NGen和RyuJIT之间没有足够的区别让你快乐。他们做非常不同的工作,提前完成NGen JIT,在流程运行时及时完成RyuJIT JIT。但是NGen没有自己的抖动,它要求RyuJIT完成这项工作。生成的机器代码没有本质上的区别。有一些优化无法提前完成,NGen ed代码稍微慢一点

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

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

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


最后但并非最不重要的一点是,RyuJIT生成的代码并不比其前身更快。它在优化方面已经做了相当不错的工作。太体面了。RyuJIT项目是为了修复遗留x64抖动中的问题而启动的,这种抖动在代码库中是非常基本的,只能通过剧烈的重写来解决。优化就是其中之一,它对它花费的时间没有上限。在大型方法上给予它非常不合理的jitting时间。因此,如果您想压缩最后一盎司,那么您应该尝试故意禁用RyuJIT,使其回到传统的x64抖动模式。

Hans,您对.NET JIT代码质量的赞扬让我心碎。@Hans Passant感谢您提供了非常详细的答案!”NGen ed代码稍微慢一点。”-你是说只是启动阶段(由于磁盘上需要找到并加载到内存中的其他文件),还是有其他原因?不幸的是,我们有一些关键的代码路径(订单发送),即使在第一次执行时也必须快速执行(JIT配置文件可能是一种方式,但Ngen在这方面更可靠)@usr-你正在用灰色眼镜阅读我的帖子。赞美??我没有跳过.NET本机。@Jan-没有,机器代码稍微慢一点。我避免谈论冷启动和热启动,因为你表示不关心。我不得不说,您如此关注速度,但似乎不知道您的代码是否足够快,这是相当奇怪的。必须使用真实数据集运行perf测试,并使用探查器查找热点。“没有人会为你做那件事。”汉斯·帕桑:说得对。然而,在Qs中通常很难给出完全相关和简洁的上下文(因此可能有点误导)。我们在4.5中测量了关键路径(使用Ngen时,第一次执行时间约为200us,而不使用Ngen时,第一次执行时间约为几十ms)。我们正在对其他代码性能进行统计评估。这些阻碍了我们升级到4.5.1和4.5.2。然而,这些评估相当全面。任何特定的信息主题都有助于关注新添加的指标(尤其是现在,因为我们需要新的GC功能,而不仅仅是决定是否升级)。