我想要以下小函数的快捷方式,其中性能非常重要(该函数被调用超过10.000.000次):
inline int len(uint32 val)
{
    if(val <= 0x000000ff) return 1;
    if(val <= 0x0000ffff) return 2;
    if(val <= 0x00ffffff) return 3;
    return 4;
} 有没有人知道...一个很酷的位操作技巧?提前感谢您的帮助!
发布于 2010-08-31 00:15:16
如果数字的分布不能使预测变得容易,那么您可以避免使用可能代价高昂的条件分支:
return 4 - (val <= 0x000000ff) - (val <= 0x0000ffff) - (val <= 0x00ffffff);将<=更改为&不会对现代处理器产生太大影响。您的目标平台是什么?
下面是使用gcc -O为x86-64生成的代码
    cmpl    $255, %edi
    setg    %al
    movzbl  %al, %eax
    addl    $3, %eax
    cmpl    $65535, %edi
    setle   %dl
    movzbl  %dl, %edx
    subl    %edx, %eax
    cmpl    $16777215, %edi
    setle   %dl
    movzbl  %dl, %edx
    subl    %edx, %eax当然,也有比较指令cmpl,但这些指令后面是setg或setle,而不是条件分支(通常是这样)。在现代流水线处理器上,条件分支是昂贵的,而不是比较。所以这个版本保存了昂贵的条件分支。
我手动优化gcc的程序集的尝试:
    cmpl    $255, %edi
    setg    %al
    addb    $3, %al
    cmpl    $65535, %edi
    setle   %dl
    subb    %dl, %al
    cmpl    $16777215, %edi
    setle   %dl
    subb    %dl, %al
    movzbl  %al, %eaxhttps://stackoverflow.com/questions/3602079
复制相似问题