我发现! = 和 = 不是测试零或非零的最快方法。
bool nonZero1 = integer != 0;
xor eax, eax
test ecx, ecx
setne al
bool nonZero2 = integer < 0 || integer > 0;
test ecx, ecx
setne al
bool zero1 = integer == 0;
xor eax, eax
test ecx, ecx
sete al
bool zero2 = !(integer < 0 || integer > 0);
test ecx, ecx
sete al
编译器: VC + + 11 优化标志:/O2/GL/LTCG
这是 x86-32的汇编输出。两种比较的第二个版本在 x86-32和 x86-64上都快了约12% 。然而,在 x86-64上,指令是相同的(第一个版本看起来与第二个版本完全一样) ,但第二个版本仍然更快。
编辑: 我添加了基准测试代码。0:1544ms,1358ms 非零: 1544ms,1358ms Http://pastebin.com/m7zsurcp 或者 Http://anonymouse.org/cgi-bin/anon-www.cgi/http://pastebin.com/m7zsurcp
注意: 在单个源文件中编译这些函数可能不太方便,因为 main.asm 非常大。我在一个单独的源文件中找到了 zero 1,zero2,nonZero1,nonZero2。
编辑2: 同时安装了 VC + + 11和 VC + + 2010的人可以运行基准测试代码并发布计时吗?这可能确实是 VC + + 11中的一个 bug。