通过使用for循环优化乘法假设乘法比加法慢

时间:2011-12-28 23:12:49

标签: optimization

如果乘法比加法慢,而不是做

7 * 8

这会从理论上改善性能吗?

for(int i =0; i < 8 ; i++){
temp += 7
}

或者我只需要做

7 + 7 + 7 + 7 + 7 + 7 + 7 + 7

3 个答案:

答案 0 :(得分:4)

你试过它并计时吗?

在如今的几乎所有现代机器上,都有快速的硬件支持来实现乘法。因此,除非简单乘以2,否,否则不会更快

在当前的英特尔机器上提供一些硬数据:

add/sub   1 cycle latency
mul/imul  3 cycle latency

取自Agner Fog's manuals

虽然它实际上比这复杂得多,但重点仍然是:不,你试图用加法替换乘法会有任何好处。

更好的少数情况下(例如乘以2的幂 - 使用移位),编译器将为您进行优化,如果它在编译时知道值

在x86上,编译器也可以使用lea指令快速乘法3,5,10等...

答案 1 :(得分:1)

我发现很难相信16个值赋值,16个加法和8个条件语句比processior可以乘以7 * 8更快。

答案 2 :(得分:1)

这取决于架构。但是,通常循环比单个本机代码慢很多(特别是由于分支)。英特尔CPU具有良好的乘法实现,因此通常优于AMD和其他CPU。您可以查看CPU的特征here。此外,您可以使用program来精确测量代码速度。

如果你真的关心速度,有时你可以近似乘法或除法。乘法的最值得注意的技巧可能是位移或查找表。例如如果你想将数字乘以2的幂数,你可以使用移位指令。

如果您需要更好的内容,可以更改号码的域名,例如具有量化表的逻辑域。在这种情况下,乘法变为加法,即log(A*B) = log(A)+log(B)

这些技巧通常用于数据压缩,以估计比特概率或实现近似算术编码器。