人々は、ビット単位のORがより概念的に適切である場合に加算を使用するのを見てきました。なぜなら、それがより速いと信じているからです。これは本当ですか?はいの場合、すべての最新のコンパイラはこのトリックを知っていますか?
4 に答える
加算と論理ORの両方は、おそらくCPUのALUの同様の部分で実行されます。測定可能なパフォーマンスの違いはほとんどありませんが、これは確実に状況で測定されているはずです。
コンパイラはこれを気にする必要はありません。通常、加算とORingが同じ結果をもたらすことをコンパイラが知る唯一の方法は、オペランドが定数である場合であり、その場合、コンパイラはコンパイル時に単純に算術を実行できます。そのためのコードを生成する必要さえあります。
「概念的に適切」と「より速い」は2つの異なるものです。前者はセマンティクスですが、後者はしばしばセマンティクスを破ることを伴います。
タイトルの質問に関しては、速度的には(あるとしても)ほとんど違いはありません。これが実際に発生するCPUのコンパイラは、通常、とにかく最適化します。異なる結果が発生しない場合は、非常にうまく機能し、通常はそうなります。
コードを正しく記述してください。ORを意味する場合は、ORを実行します。add-vs-ORの方が高速になった場合は、コンパイラが自動的に実行するか、反復ごとに0.5ナノ秒余分にかかる可能性があるかどうかを判断した後で、読みやすさやバグなどのコストに見合うかどうかを判断した後で変更できます。変更が発生する可能性があります。
実際、コンパイラーは一般に、その置換を適切な方法で行うのに十分なほど賢いです。この種の最適化の用語は強度低減であり、これは本の中で最も古いトリックです。
通常は高速ではなく、偶数のアドレスまたは値に1を「追加」していることがわかっていない限り、ほとんどの場合間違っています。