小编use*_*213的帖子

使用程序集加快一点测试操作

我有一个性能问题 - 我无法击败编译器生成代码的发布版本速度.它慢了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

3
推荐指数
1
解决办法
718
查看次数