根据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位机器上执行相同的操作,为什么会有这么大的差异呢?
答案 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。