哪个产生更快的代码?

时间:2015-02-03 22:41:43

标签: c++ performance

编译为更快的代码:pm1 = x * 3;pm1 = x + ( x * 2 );

假设xintlong,它正在现代Win32英特尔盒子上运行。

1 个答案:

答案 0 :(得分:2)

您问题的真正答案是:"取决于平台和编译器设置"。

让我们以不优化为例 有3例。

案例1:将变量添加3次。

说明:

  MOV Y, 0    ; Set Y to zero.
  ADD Y, Y, X ; Add X to Y and place result in Y.
  ADD Y, Y, X ; Add X to Y and place result in Y.
  ADD Y, Y, X ; Add X to Y and place result in Y.

处理器将获取4并处理4条指令。瓶颈可能在获取的持续时间内。

案例2:Multipy by 2并添加一次

说明:

  MOV Y, 0
  MUL Y, X, 2  ; Multipy X by 2 and store into Y.
  ADD Y, Y, X ; Add X to Y and place result in Y.

注意,只有少量指令,但乘法需要更长时间。很难判断乘法是否比获取更快。

如果我们使用移位而不是乘以2:

  MOV Y, 0
  SHL Y, X, 1 ; Shift the bits in X left by one bit, place result in Y.
  ADD Y, Y, X ; Add X to Y and place result in Y.

这会更快,因为一位移位比乘法更快 节约是否重要?

案例3:乘以3

说明:

MOV Y, 0
MUL Y, X, 3 ; Multipy X by 3 and place result in Y.

只有2条指令,但乘法需要比移位或添加更长的时间。它比抓取更快吗?不知道,这是需要的性能测量。

结论:

需要在不同系统上分析实验以获得正确的结果。乘以减少从处理器的高速缓存中提取的指令数。然而,乘法是比加法或移位更复杂的操作。如果乘法比从缓存中获取更快,那么可以节省一些成本。

最大的问题是,节省了多少执行时间?不多。如果我们假设处理器平均需要100ns来执行指令,那么最好的情况是保存2条指令或200 ns。考虑相对时间,用户输入以秒为单位测量,I / O以毫秒为单位。您可以通过优化用户输入或文件I / O获得更多时间。

如果您获得200ns,则会等待用户输入或文件I / O或操作系统将您的程序与另一个程序交换而浪费。

这些微优化带来的生产力损失很大。研究和分析这个实验所花费的时间可以更好地用于开发程序的其余部分并使程序正确和健壮。