我应该使用位移还是除法?

时间:2014-11-21 01:01:40

标签: performance compiler-optimization

维基百科说,按2的权力划分

  

由于位移通常比除法快得多,因此以这种方式用移位替换除法可能是程序优化中有用的步骤。[5]但是,为了软件的可移植性和可读性,通常最好使用除法运算编写程序并信任编译器来执行此替换。

我可以信任编译器吗?哪些编译器(尤其是C编译器和java编译器)将用>> k替换/ 2 ^ k?

1 个答案:

答案 0 :(得分:2)

对于有符号类型除法和右移是从编译器的角度看的不同操作,即使你知道该值是非负的,除非它在编译时已知并且编译器能够使用它。

对于无符号类型,我相信所有体面的现代编译器都会改变划分。例如,对于此代码:

unsigned my_div(unsigned x) {
    return x / 32;
}

unsigned my_shift(unsigned x) {
    return x >> 5;
}

GCCClang为这两个函数生成相同的相同汇编输出。

(当功能采用int代替unsigned时,请注意difference

所以,通常你应该使用普通除法,因为它保证是正确的。只有在以下情况下才应将其替换为右移:

  1. 显着提高了程序的性能
  2. 操作数不能为负数(或者你真的知道自己在做什么)