乘以0.5而不是除以2

nik*_*iko 14 c

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

而且我看到人们经常使用i << 2而不是i x 4因为移动速度更快.

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

huy*_*itw 22

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

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

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

address = x + (y << 8) + (y << 6)
Run Code Online (Sandbox Code Playgroud)

将y乘以320.在现代处理器上,这可能比仅仅做得更慢:

address = x + y * 320;
Run Code Online (Sandbox Code Playgroud)

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


Dav*_*ave 16

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

http://gcc.godbolt.org/

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

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