【发布时间】:2017-02-21 04:35:14
【问题描述】:
根据this QA,在 64 位机器上运行时,使用 Any 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();
}
在任何 CPU 平台的发布版本中,结果是:
Sum = 9745675244420464640, took 13148ms
在 x64 平台发布版本中,结果为:Sum = 9745675244420464640, took 5693ms
这是性能提升的两倍多。如果普遍的假设是任何 CPU 与 x64 构建都应该在 64 位机器上执行相同的操作,为什么会有如此大的差异?
【问题讨论】:
-
是有还是没有优化代码?
-
我建议你打印出
Environment.Is64BitProcess只是为了检查它真的正在运行 64 位代码... -
@JonSkeet 你一针见血。任何 CPU 都在运行 32 位代码。我的印象是任何 CPU 在 64 位机器上执行时都将始终运行 64 位。有没有办法强制这样做,或者 x64 是要走的路吗?
-
成功了,取消选中
Prefer 32-bit强制 64 位代码,谢谢。你想发布答案,还是我应该删除这个问题?
标签: c# performance clr