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

标签 c# performance visual-studio-2015 clr ryujit

我有以下 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/

相关文章:

c# - Xamarin android C# ScrollView OnScrollChanged 事件

c# - List<T>.InsertRange() 或设计决策中的错误?

c# - 从 File.ReadAllBytes (byte[]) 中删除字节顺序标记

java - 我们应该使用最顶层的父类作为引用变量的类型吗?

git - 在 Visual Studio 2015 中使用外部克隆的 Git 存储库

C# - 从文件夹中播放随机声音文件

javascript - jquery性能问题, Action 注册

c# - Nested Loop函数需要几分钟才能运行,无论如何提高效率?

ios - 在 iOS 上调试 Apache Cordova 应用程序时出现 500 错误

visual-studio-2015 - 为每个新行注释启用自动星号和花括号自动格式化