gpt4 book ai didi

c# - 在 64 位下执行缓慢。可能是 RyuJIT 错误?

转载 作者:太空狗 更新时间:2023-10-29 21:08:21 26 4
gpt4 key购买 nike

我有以下 C# 代码试图在 Release模式下进行基准测试:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication54
{
class Program
{
static void Main(string[] args)
{
int counter = 0;
var sw = new Stopwatch();
unchecked
{
int sum = 0;
while (true)
{
try
{
if (counter > 20)
throw new Exception("exception");
}
catch
{
}

sw.Restart();
for (int i = 0; i < int.MaxValue; i++)
{
sum += i;
}
counter++;
Console.WriteLine(sw.Elapsed);
}

}
}
}
}

我在 64 位机器上安装了 VS 2015。当我在 32 位下运行代码时,它运行每次迭代大约 0.6 秒,打印到控制台。当我在 64 位下运行它时,每次迭代的持续时间直接跳到 4 秒!我在仅安装了 VS 2013 的同事计算机上尝试了示例代码。 32 位和 64 位版本均运行 0.6 秒

除此之外,如果我们只删除 try catch block ,它在 64 位 VS 2015 中也可以在 0.6 秒 内运行。

当有 try catch block 时,这看起来像是严重的 RyuJIT 回归。我说得对吗?

最佳答案

基准测试是一门艺术。对您的代码进行少量修改:

   Console.WriteLine("{0}", sw.Elapsed, sum);

现在您会发现差异消失了。或者换句话说,x86 版本现在和 x64 代码一样慢。您可能可以从这个小改动中找出 RyuJIT 没有做什么遗留抖动所做的事情,它并没有消除不必要的

   sum += i;

当您使用“调试”>“Windows”>“反汇编”查看生成的机器代码时,您可以看到一些东西。这确实是 RyuJIT 中的一个怪癖。它的死代码消除不如遗留抖动那么彻底。否则并非完全没有理由,微软重写了 x64 抖动,因为它无法轻易修复的错误。其中之一是优化器的一个相当棘手的问题,它在优化方法上花费的时间没有上限。在具有非常大的主体的方法上导致相当糟糕的行为,它可能会在树林中出现几十毫秒并导致明显的执行暂停。

称它为错误,嗯,不是真的。编写合理的代码,抖动不会让您失望。优化确实总是从通常的地方开始,在程序员的耳朵之间。

关于c# - 在 64 位下执行缓慢。可能是 RyuJIT 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33774393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com