当我在阅读C中的提示时,我在这里看到了这个提示http://www.cprogramming.com/tips/tip/multiply-rather-than-divide 但我不确定。有人告诉我,乘法和除法都比较慢且耗时,需要很多周期。
我看到人们经常使用i << 2
代替i x 4
,因为转移更快。
使用x0.5 or /2
这是一个很好的提示吗?或者现代编译器是否会以更好的方式对其进行优化?
答案 0 :(得分:21)
确实有些(如果不是大多数)处理器可以比执行除法运算更快地繁殖,但是,它就像{for循环中++i
比i++
更快的神话。是的,它曾经是,但现在,编译器足够聪明,可以为你优化所有这些东西,所以你不应该再关心它了。
关于比特移位,移位<< 2
的速度一度比乘以4快,但是那些日子结束了,因为大多数处理器可以在一个时钟周期内相乘,就像移位操作一样。
这方面的一个很好的例子是VGA 320x240
模式下像素地址的计算。他们都这样做了:
address = x + (y << 8) + (y << 6)
将y与320相乘。在现代处理器上,这可能比仅仅更慢:
address = x + y * 320;
所以,只需编写您的想法,编译器将完成其余的工作:)
答案 1 :(得分:16)
我发现这项服务对于测试这类东西非常宝贵:
看看最后的装配。在99%的情况下,您将看到编译器无论如何都将它全部优化为相同的代码。不要浪费脑力!
在某些情况下,最好明确地编写它。例如,2^n
(其中n是正整数)可以写为(int) pow( 2.0, n )
,但使用1<<n
显然更好(并且编译器不会为您进行优化) 。所以值得把这些东西放在脑海里。与任何事情一样,不要过早优化。
答案 2 :(得分:2)
“乘以0.5而不是除以2”(2.0)在更少的环境中比以前更快,主要是由于改进的编译器将优化代码。
出于类似原因,“使用i&lt;&lt;&lt;&lt;&lt;&lt;&lt; 2代替i x 4”在更少的环境中更快。
在选择的情况下,程序员仍然需要处理这些问题,但这种情况越来越少见。代码维护继续成为主导问题。因此,请使用对代码段最有意义的内容:x*0.5
,x/2.0
,half(x)
等。
编译器可以轻松优化代码。建议您考虑高级别问题的代码。 E. g。算法是O(n)还是O(n * n)?
传递的重要思想是最佳代码设计实践发展,并且环境之间会发生变化。适应性强。今天最好的东西可能在未来转移(或倍增)。
答案 3 :(得分:1)
许多CPU可以在1或2个时钟周期内执行乘法,但除法总是需要更长时间(尽管FP除法有时比整数除法更快)。
如果你看一下这个答案How can I compare the performance of log() and fp division in C++?,你会看到该分裂可以超过24个循环。
为什么除法比乘法要长得多?如果你还记得回到小学,你可能会记得,乘法基本上可以通过多次同时添加来执行。除法需要不能同时执行的迭代减法,因此需要更长的时间。实际上,一些FP单元通过执行倒数近似并乘以它来加速除法。它不是那么准确,但有点快。
答案 4 :(得分:1)
如果你正在使用整数,并且你希望得到一个整数作为结果,最好使用/ 2
,这样可以避免从浮点数到浮点数的不必要转换