4

最初の操作は2番目の操作よりも速いですか?

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

基本的にはどちらも同じことをしますがu= u+(10*u) 、最初の操作が2番目の操作よりも速いことがわかりました。操作+が*と異なる場合のCPU時間はありますか。Is multiplication by 10 actually equivalent to 10 addition operations being performed ?

4

3 に答える 3

15

これは、基盤となるCPUとコンパイラの機能によって異なります。

適切なコンパイラはu*10、高速になると思われる場合は、適切なビットシフト操作に最​​適化する必要があります。逆のことはできないかもしれません。したがって、悪いコンパイラを使用していることがわかっている場合を除いて、u*10意味する場合は常に記述してください。u*10

于 2012-04-30T14:54:31.830 に答える
6

プロファイラーを使用して、生成されたマシン コードを観察します。

コンパイラはおそらく両方を同じマシンコードに最適化するため、実行時間に違いがあるとは考えにくいです。

私の主張を主張するために、2 で簡単なプロファイル テストを実行しました。2 つの小さなバイナリ (操作ごとに 1 つ) を作成し、10e6 整数値を処理するために実行の時間を計りました。どちらも、私のマシン (g++ を使用する mac i7) で ~38 ミリ秒を報告します。したがって、最終的にはどちらも同じ数の操作になると想定しても安全です。他のコンパイラ/プロセッサの組み合わせでも結果は同じになる可能性があります。

. . . 両方が同じパフォーマンスを提供する場合:

u+= u*10  //second operation 

..一目で理解するのがはるかに簡単だからです。

于 2012-04-30T14:54:44.510 に答える
4

コンパイラの翻訳とプロセッサによって異なります。一部のプロセッサには乗算ユニットがあるため、実際の乗算には1つの命令しか必要ありません。

これまでのところ、最初の命令には少なくとも3つの命令が必要です。

疑わしい場合は、プロファイルします。

于 2012-04-30T14:55:24.700 に答える