乘法优化

时间:2011-07-29 21:13:13

标签: optimization

我听说,有一种方法可以将a * 10操作(使用任何语言)优化为类似a * 2 * 2 * 2 + a * 2的内容,并获得很大的好处,因为*2转换为简单的二进制移位操作和比乘法运算快得多。
这样对吗?

2 个答案:

答案 0 :(得分:5)

是的,那是真的。但是,如果将变量乘以适当的常量(如果它适合目标CPU架构),一个好的编译器可能会自动为您执行此操作。

我刚刚在英特尔目标上使用GCC尝试过此操作,-O没有使用shift-and-add方法。我想imul指令更快。但是,我当然看到GCC使用ARM目标生成的这种类型的代码,其中乘法指令相对较慢。

答案 1 :(得分:1)

如前所述,优化代码的最佳方法取决于特定的CPU。但是,鉴于现代处理器支持深度流水线,寄存器重命名和乱序执行,它实际上也非常依赖于周围的代码,以及可以安排到空白中的内容。

Check out this list of latencies and throughputs。在现代dektop处理器上进行4班制和增加与1乘法:一个班次的吞吐量是2倍,延迟的1/3(在Nehalem或Sandybridge上)。即使没有添加,其中4个几乎肯定会是一个损失。在其他处理器上,情况可能会有所不同。我说“差不多”,因为可以想象,多平台单元可以处理附近代码中的另一个乘法链,留下移位和加法单元可以并行乘以10。

总是自己尝试并测量,当然,只有当你真的必须计算时钟时才这样做。 : - )