我有一个性能问题 - 我无法击败编译器生成代码的发布版本速度.它慢了25%.我写的函数在我的测试中大约被调用了2000万次,所以让它运行得更快就能获得回报.
C++中的代码非常简单:
static inline char GetBit(char *data, size_t bit)
{
return 0 != (data[bit / 8] & (1 << (bit % 8)));
}
Run Code Online (Sandbox Code Playgroud)
这是我为64位MASM编写的版本:
mov rax, rdx
mov r10, 8h
xor rdx, rdx
div rax, r10
mov al, byte ptr [rax+rcx]
mov bl, 1h
mov cl, dl
shl bl, cl
and al, bl
shr al, cl
ret
Run Code Online (Sandbox Code Playgroud)
好吧,我不是一个汇编人员,但我不认为编译器可以使代码更快25%,只是创建更好的汇编.所以诀窍是[可能]在函数调用中.它尊重C++代码的inline关键字并且不生成调用,但我无法使其适用于asm代码:
extern "C" inline char GetBitAsm(char *data, size_t bit);
Run Code Online (Sandbox Code Playgroud)
我使用dumpbin反汇编代码,我可以清楚地看到我的代码+函数调用.虽然没有为编译器的版本生成调用:
mov rdx, qword ptr [bit]
mov rcx, qword ptr …Run Code Online (Sandbox Code Playgroud) c++ compiler-construction performance assembly compiler-optimization