为什么2代码的整数幂更快?

时间:2017-03-08 23:55:35

标签: c++ performance c++14 compiler-optimization clang++

所以,我正在做很多涉及计算2的幂的计算,所以我决定编写最快的函数来计算它们。我最初写了以下内容:

inline
auto pow2(const int exp){
  auto base = 1;
  return base<<=exp;
}

由于一次通过精确的位移,这是非常快速的,但后来我决定测试以下内容:

inline
auto pow2(const int exp, unsigned int base=1){
  return base<<=exp;
}

该函数被调用为:

result = pow2(exponent);

这使我的代码快30%(clang ++和g ++ with -O3),但我不确定原因。我怀疑这是因为编译器以某种方式避免分配base变量而只使用临时对象,但它只是疯狂猜测;由于这种语法,我不明白究竟避免了哪些指令。有什么想法吗?

编辑:汇编程序输出如下:

第一个版本(函数体中base var):

pow2(int):
        mov     ecx, edi
        mov     eax, 1
        sal     eax, cl
        ret

第二个版本(声明中base var):

pow2(int, unsigned int):
        mov     eax, esi
        mov     ecx, edi
        sal     eax, cl
        ret

Edit2:更多信息:根据评论中的反馈,我决定在不同的机器上测试代码,并获得一些有趣的东西。在配备Intel(R)Core(TM)i7-2600 CPU @ 3.40GHz的工作计算机上,此代码的速度确实提高了30%。在我的笔记本电脑上,使用Intel(R)Core(TM)i7-4600U CPU @ 2.10GHz,两个版本的基准测试相同。

0 个答案:

没有答案