编辑:事实上,我的时间代码存在奇怪的错误,导致了这些结果。当我修复了我的错误后,智能版本的速度如预期一样更快。我的时间代码如下:
bool x = false;
before = now();
for (int i=0; i<N; ++i) {
x ^= smart_xor(A[i],B[i]);
}
after = now();
我曾经使用
^=
来阻止编译器优化for循环。但我认为^=
与两个异或函数的交互方式有些奇怪。我将计时代码更改为简单地填充一个异或结果数组,然后在计时代码之外使用该数组进行计算。这样就解决了问题。
我应该删除这个问题吗?
结束编辑
我定义了两个C++函数如下:
bool smart_xor(bool a, bool b) {
return a^b;
}
bool dumb_xor(bool a, bool b) {
return a?!b:b;
}
我的时间测试表明,
dumb_xor()
稍微快一些(内联时为 1.31ns vs 1.90ns ,未内联时为 1.92ns vs 2.21ns)。这让我感到困惑,因为 ^
运算符应该是一个单机操作。我想知道是否有人可以解释这个问题。汇编代码如下(未内联时):
.file "xor.cpp"
.text
.p2align 4,,15
.globl _Z9smart_xorbb
.type _Z9smart_xorbb, @function
_Z9smart_xorbb:
.LFB0:
.cfi_startproc
.cfi_personality 0x3,__gxx_personality_v0
movl %esi, %eax
xorl %edi, %eax
ret
.cfi_endproc
.LFE0:
.size _Z9smart_xorbb, .-_Z9smart_xorbb
.p2align 4,,15
.globl _Z8dumb_xorbb
.type _Z8dumb_xorbb, @function
_Z8dumb_xorbb:
.LFB1:
.cfi_startproc
.cfi_personality 0x3,__gxx_personality_v0
movl %esi, %edx
movl %esi, %eax
xorl $1, %edx
testb %dil, %dil
cmovne %edx, %eax
ret
.cfi_endproc
.LFE1:
.size _Z8dumb_xorbb, .-_Z8dumb_xorbb
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits
我正在使用Intel Xeon X5570上的g++ 4.4.3-4ubuntu5。我使用了-O3进行编译。
a != b
而不是a ? !b : b
。 - Pubbyreturn a != b;
? - Drew Dormann