64位计算机上AnyCPU与x64平台之间的性能差异

时间:2016-10-12 11:31:16

标签: c# performance clr

根据this QA,在64位计算机上运行使用任何CPU和x64构建的应用程序之间应该没有性能差异,但是当我具体使用时,我看到我的用例性能翻了一番为x64平台而构建。

我的用例是操作64位bitboards,大部分处理是对ulong变量的位操作和算术。

举个例子:

public static ulong ReverseBits(ulong x)
{
    ulong t;
    x = (x << 32) | (x >> 32); // Swap register halves.
    x = (x & 0x0001FFFF0001FFFFUL) << 15 | // Rotate left
        (x & 0xFFFE0000FFFE0000UL) >> 17; // 15.
    t = (x ^ (x >> 10)) & 0x003F801F003F801FUL;
    x = (t | (t << 10)) ^ x;
    t = (x ^ (x >> 4)) & 0x0E0384210E038421UL;
    x = (t | (t << 4)) ^ x;
    t = (x ^ (x >> 2)) & 0x2248884222488842UL;
    x = (t | (t << 2)) ^ x;
    return x;
}

static void Main(string[] args)
{
    ulong sum = 0;
    var s = Stopwatch.StartNew();
    for (ulong i = 0; i < 1000000000; i++)
    {
        sum += ReverseBits(i);
    }
    s.Stop();

    Console.WriteLine("Sum = {0}, took {1}ms", sum, s.ElapsedMilliseconds);
    Console.ReadLine();
}

在使用Any CPU平台的Release版本中,结果是: Sum = 9745675244420464640, took 13148ms

在使用x64平台的发布版本中,结果为:Sum = 9745675244420464640, took 5693ms

这是性能提升的两倍多。如果常见的假设是任何CPU vs x64版本应该在64位机器上执行相同的操作,为什么会有这么大的差异呢?

1 个答案:

答案 0 :(得分:6)

不,你比较了32位和64位代码之间的性能。 x64的味道要快得多,因为它可以使用单个64位处理器寄存器进行数学计算。它更像是一个32位机器代码,它必须兼顾两个32位寄存器。用Debug&gt;很容易看出两者之间的区别Windows&gt;拆卸。

这是错误的,因为您过分关注解决方案平台名称。太突出显示了,但选择只对C ++项目有意义。不幸的是,由于.NET Native,在UWP项目上。它选择构建工具的风格,C#只有一个可以针对任何平台的编译器。

重要的真实设置是抖动强制选项。项目&gt;属性&gt;构建标签。如有必要,选择Release版本并选择平台目标和&#34;首选32位&#34;设置。解开后者。您现在可以在64位操作系统上看到AnyCPU == x64。