c# – 在64位下执行缓慢.可能的RyuJIT错误?

我有以下C#代码尝试在发布模式下进行基准测试:
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块,它也会在0.6秒内运行,VS 2015在64位.

当有一个try catch块时,这看起来像一个严重的RyuJIT回归.我对么 ?

解决方法

基准测试是一门艺术.对您的代码进行一些小修改
Console.WriteLine("{0}",sw.Elapsed,sum);

你现在看到差异消失了.换句话说,x86版本现在和x64代码一样慢.你可以弄清楚RyuJIT没有做什么传统的抖动从这个微小的变化做了什么,它并没有消除不必要的

sum += i;

使用Debug>查看生成的机器代码时可以看到的内容Windows>拆卸.这在RyuJIT确实是一个怪癖.其死代码消除不如传统抖动那么彻底.否则不完全没有理由,微软重写了x64抖动,因为它无法轻易解决错误.其中一个是优化器的一个相当讨厌的问题,它在优化方法上花费的时间没有上限.在具有非常大的物体的方法上导致相当差的行为,它可能在树林中出现几十毫秒并导致明显的执行暂停.

把它称为虫子,嗯,不是真的.写出合理的代码和抖动不会让你失望.优化确实始于通常的位置,在程序员的耳朵之间.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


原文地址:http://msdn.microsoft.com/en-us/magazine/cc163791.aspx 原文发布日期: 9/19/2005 原文已经被 Microsoft 删除了,收集过程中发现很多文章图都不全,那是因为原文的图都不全,所以特收集完整全文。 目录 前言 CLR启动程序
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采纳和使用,它的确提供了很多的优势也解决了很多的问题,但是我们也知道也并不是银弹,提供优势的同时它也给我们的开发人员和团队也带来了很多的挑战。 为了迎接或者采用这些新技术,开发团队需要更加注重一些流程或工具的使用,这样才能更好的适应这些新技术所
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下PLINQ中的分区。上一篇介绍了并行编程,这边详细介绍一下并行编程中的分区和自定义分区。 先做个假设,假设我们有一个200Mb的文本文件需要读取,怎么样才能做到最优的速度呢?对,很显然就是拆分,把文本文件拆分成很多个小文件,充分利用我们计算机中
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Microsoft为了利用这个硬件特性,于是在Visual Studio 2010 和 .NET Framework 4的发布及以上版本中,添加了并行编程这个新特性,我想它以后势必会改变我们的开发方式。 在以前或者说现在,我们在并行开发的时候可
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么
c语言怎么求字符串的长度并输出
c语言函数的三种调用方式是什么
c语言中保留两位小数怎么表示
double的输入格式符是什么
长整型输出格式是什么
C语言中文件包含的命令关键字是什么
c程序如何编写x的y次方
c语言开根号代码是什么
c语言怎么进行字符串比较
c语言怎么进行强制类型转换
c语言运算符的优先级顺序是什么
c++用什么软件编程
中序遍历是怎么遍历的
h文件和c文件的关系是什么