编辑:确实,我的时序代码中有一个奇怪的错误导致这些结果。当我修复我的错误时,智能版本的运行速度比预期的要快。我的计时代码如下所示:
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 与 1.90ns,未内联时为 1.92ns 与 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编译。