Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.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# 在64位Windows 7中,x64比x86快得多,为什么?_C#_Visual Studio 2012_Performance Testing - Fatal编程技术网

C# 在64位Windows 7中,x64比x86快得多,为什么?

C# 在64位Windows 7中,x64比x86快得多,为什么?,c#,visual-studio-2012,performance-testing,C#,Visual Studio 2012,Performance Testing,我想创建一个非常基本的应用程序来测试64位和32位的性能,看看哪一个在我的计算机上运行得最好。 令我惊讶的是,我发现x64的速度大约是x86的3倍。 我使用VS 2012 Ultimate编译发行版,作为独立应用程序运行,无需调试。 这是一个WinForm应用程序,带有一个按钮和两个文本框。 在x64版本中,完成大约需要120毫秒,而x86构建大约需要350毫秒。 另外,如果我将数据类型从int改为Int64,那么两个代码路径的速度都会降低大约3倍 我知道x64在64位windows上运行,32

我想创建一个非常基本的应用程序来测试64位和32位的性能,看看哪一个在我的计算机上运行得最好。 令我惊讶的是,我发现x64的速度大约是x86的3倍。 我使用VS 2012 Ultimate编译发行版,作为独立应用程序运行,无需调试。 这是一个WinForm应用程序,带有一个按钮和两个文本框。 在x64版本中,完成大约需要120毫秒,而x86构建大约需要350毫秒。 另外,如果我将数据类型从int改为Int64,那么两个代码路径的速度都会降低大约3倍

我知道x64在64位windows上运行,32位是通过WoW转换的,但在线比较表明,64位上的32位运行时没有明显的性能损失,除非它使用我没有的安腾CPU

另一种可能性是VS2012编译器对x64的优化程度更高,但3倍的性能差异与常规优化相比是否合理

不管是哪种方式,只要有可能,我最好在我的机器上编译成x64。 谁能给我一些简单的例子,说明x86可能更好

这是我的测试代码

    DateTime startTime;
    DateTime stopTime;
    int waitValue;

    private void button1_Click(object sender, EventArgs e)
    {
        string startText = textBox1.Text;
        int value;
        if (int.TryParse(startText, out value))
        {
            waitValue = value - 1;
        }
        else
        {
            value = 1000000;
            waitValue = value - 1;
            textBox1.Text = value.ToString();
        }

        startTime = DateTime.Now;
        for (int ii = 0; ii < value; ii++)
        {
            shortProcess(ii);
        }
    }

    private int shortProcess(int value)
    {
        int startValue = value;
        int useVal = startValue;
        for (int ii = 0; ii < 1000; ii++)
        {
            useVal = ii;
        }
        useVal = startValue;
        checkValue(useVal);
        return useVal;
    }

    private void checkValue(int value)
    {
        if (value >= waitValue)
        {
            stopTime = DateTime.Now;
            //textBox2.Text = (stopTime.Ticks - startTime.Ticks).ToString();
            textBox2.Text = (stopTime.Subtract(startTime).TotalMilliseconds).ToString();
        }
    }

这里回答了一个非常类似的问题:


该测试更复杂,需要更多的数学运算,但结果与我的结果相似,甚至比我的结果更极端,这意味着x64是最好的选择。

只是一个注释-据我所知,如果你在64位版本的Windows下运行64位应用程序,这是本机的,但是如果你在同一版本的Windows上运行32位应用程序,它必须被翻译,这样64位的架构才能正确地阅读它,这可能不会对你的代码产生任何影响,只是认为它值得一提。我想知道这些结果是否是典型的,你是否可以发布你的结果-我们不是一个测试平台社区,你不太可能被样本数据淹没。此外,你还需要知道处理器、操作系统、配置等等。此外,您的示例代码对于基准测试也不是很好,您可能希望检查您是否真的只测试了一件您没有测试的事情。您看到的结果很可能是x64 JIT优化器在这个人工测试用例中优于x86 JIT优化器,至少优于x86 JIT优化器。如果你试图要求解释,而不是试图进行投票,这可能是一个可以接受的问题。相关问题:我编辑了代码,使其更像是建议的问题。我看过其他的帖子和一些其他的帖子,但是每一篇都非常笼统,没有任何可测试的结论。我也不知道这是否仅限于我的机器,还是仅仅限于VS 2012,这就是我寻求确认的原因,或者我可以做些什么来改进我的测试。更正:x64可能是一条出路。这并不总是一场性能胜利。与任何工程决策一样,存在权衡。例如,指针在64位世界中更大,这意味着内存占用更大。当然,上限更高,但压力也更大。更不用说缓存了,它的大小相同,因此填充速度更快。使用64位宽的类型时,x64几乎总是更快,但普通应用程序很少需要这么多位。由于只有32位,性能差异最小。你必须测试才能确定。