乘以0.5而不是除以2

时间:2013-08-10 18:26:03

标签: c

当我在阅读C中的提示时,我在这里看到了这个提示http://www.cprogramming.com/tips/tip/multiply-rather-than-divide 但我不确定。有人告诉我,乘法和除法都比较慢且耗时,需要很多周期。

我看到人们经常使用i << 2代替i x 4,因为转移更快。

使用x0.5 or /2这是一个很好的提示吗?或者现代编译器是否会以更好的方式对其进行优化?

5 个答案:

答案 0 :(得分:21)

确实有些(如果不是大多数)处理器可以比执行除法运算更快地繁殖,但是,它就像{for循环中++ii++更快的神话。是的,它曾经是,但现在,编译器足够聪明,可以为你优化所有这些东西,所以你不应该再关心它了。

关于比特移位,移位<< 2的速度一度比乘以4快,但是那些日子结束了,因为大多数处理器可以在一个时钟周期内相乘,就像移位操作一样。

这方面的一个很好的例子是VGA 320x240模式下像素地址的计算。他们都这样做了:

address = x + (y << 8) + (y << 6)

将y与320相乘。在现代处理器上,这可能比仅仅更慢:

address = x + y * 320;

所以,只需编写您的想法,编译器将完成其余的工作:)

答案 1 :(得分:16)

我发现这项服务对于测试这类东西非常宝贵:

http://gcc.godbolt.org/

看看最后的装配。在99%的情况下,您将看到编译器无论如何都将它全部优化为相同的代码。不要浪费脑力!

在某些情况下,最好明确地编写它。例如,2^n(其中n是正整数)可以写为(int) pow( 2.0, n ),但使用1<<n显然更好(并且编译器不会为您进行优化) 。所以值得把这些东西放在脑海里。与任何事情一样,不要过早优化。

答案 2 :(得分:2)

  1. “乘以0.5而不是除以2”(2.0)在更少的环境中比以前更快,主要是由于改进的编译器将优化代码。

  2. 出于类似原因,“使用i&lt;&lt;&lt;&lt;&lt;&lt;&lt; 2代替i x 4”在更少的环境中更快。

  3. 选择的情况下,程序员仍然需要处理这些问题,但这种情况越来越少见。代码维护继续成为主导问题。因此,请使用对代码段最有意义的内容:x*0.5x/2.0half(x)等。

  4. 编译器可以轻松优化代码。建议您考虑高级别问题的代码。 E. g。算法是O(n)还是O(n * n)?

  5. 传递的重要思想是最佳代码设计实践发展,并且环境之间会发生变化。适应性强。今天最好的东西可能在未来转移(或倍增)。

答案 3 :(得分:1)

许多CPU可以在1或2个时钟周期内执行乘法,但除法总是需要更长时间(尽管FP除法有时比整数除法更快)。

如果你看一下这个答案How can I compare the performance of log() and fp division in C++?,你会看到该分裂可以超过24个循环。

为什么除法比乘法要长得多?如果你还记得回到小学,你可能会记得,乘法基本上可以通过多次同时添加来执行。除法需要不能同时执行的迭代减法,因此需要更长的时间。实际上,一些FP单元通过执行倒数近似并乘以它来加速除法。它不是那么准确,但有点快。

答案 4 :(得分:1)

如果你正在使用整数,并且你希望得到一个整数作为结果,最好使用/ 2,这样可以避免从浮点数到浮点数的不必要转换