2012-04-30 23 views
4

第一次运行比第二次运行快吗?第一次手术是否应该更快,如果是的话,为什么?

u+= (u << 3) + (u << 1) //first operation 
    u+= u*10 //second operation 

基本上他们两个做同样的事就是u= u+(10*u) 但我来到知道,第一个操作比第二快。 运行时的CPU时间与*不同。 Is multiplication by 10 actually equivalent to 10 addition operations being performed ?

+6

如果速度更快,你的理解速度会更快,那么'u + = u * 10'就是一个! – assylias

+9

根据具体情况,“u * = 11”可能更容易理解。 – Fanael

+2

这个问题是重复的,除了仅询问Java和.NET的事实(尽管答案也适用于C和C++):http://stackoverflow.com/questions/1168451/is-shifting-bits在Java网络中快速扩大和分割的底线是你应该编写表达你的意图的代码。编译器今天非常擅长通过常量优化乘法或除法运算。而且他们会得到愚蠢的东西(比如正确地处理符号算术),如果你手动进行换档,情况可能并非总是如此。 –

回答

15

它取决于底层CPU和编译器的功能。

任何体面的编译器应该优化u*10进入适当的位移操作,如果它认为它们会更快。它可能无法做相反的事情。所以如果你的意思是u*10,总是写u*10,除非你知道你正在使用一个糟糕的编译器。

6

使用探查并观察所生成的机器代码

执行时间不会有任何差异,因为编译器可能会同时优化相同的机器码。

我刚刚在2上跑过快速轮廓测试以证实我的说法。我制作了2个小型二进制文件(每个操作一个)并定时执行处理10e6个整数值。两者都在我的机器上报告〜38毫秒(使用g ++的mac i7)。因此,假设两者最终都以相同数量的操作结束是安全的。其他编译器/处理器组合的结果可能相同。

。 。 。如果两者给出相同的性能使用:

u+= u*10 //second operation 

..只是因为它更容易理解一目了然。

+0

+1用于支持可读性。 –

4

取决于编译器的翻译和处理器。一些处理器具有乘法单元,所以实际上乘法只需要一条指令。

到目前为止,第一个需要至少3条指令。

如有疑问,简介。

相关问题