3

複数の情報源(一部はここにあり、ビット単位の演算に関するWikipediaの記事)では、ビットシフトを使用して計算する方が通常の乗算​​/除算/加算よりも高速であると述べています。ただし、これは実際には古いプロセッサにのみ適用され、最新のプロセッサのほとんどは速度が実質的に同じになるようになっているとも述べています。

その声明はどれほど有効ですか?JavaまたはC#では、通常の数学オペランドを使用するだけで安全ですか?これらのオペランドの代わりにビットシフトを使用することは、もう本当に必要ですか?

4

2 に答える 2

9

これはコンパイラに任せるだけです。優れたコンパイラは、対象となるハードウェアを認識しています。コンパイラは、ビット単位の操作の方が高速であることを認識している場合、そのように実行するコードを発行できます。人間が読めるコードは常に、実行中の操作を正しく表現する最も明確な方法で記述する必要があります。あとはコンパイラに任せましょう。

ビット単位の演算が算術演算よりも高速であるということが今でも真実であるかどうかについては、私はそう信じています。確かに、最新の C++ コンパイラの多くは、算術演算にビット演算を使用するコードを生成します。

于 2012-05-22T15:18:36.210 に答える
2

今日のアーキテクチャとコンパイラでビット単位の操作を使用する場合と単純な演算子を使用する場合の違いの規模はわかりません (私の推測では...ほとんどの問題ではほとんどありません)。

私は、今日あなたが書くほとんどのコードが実際には CPU 操作ではなく、データベース アクセス、I/O、ネットワークでボトルネックになっているという事実に基づいています (はい、ここでは冗長です)。

たとえば、JVM のコンパイラは、コードを実行しているアーキテクチャに対してすでに多くの操作を最適化し、開発者からこの必要性を抽象化しています (それが目的です)。

最後に言いたいのは... 読みやすさです。一部のビット操作ファンが何を主張しようとも、コードの途中でのビット操作は、通常、ほとんどの開発者にとって、単に標準的な数学を使用する場合よりもはるかに読みにくくなります。

コードを理解するコストと、コードを変更する必要があるときに誰かがバグを導入する可能性の増加により、リスクはメリットをはるかに上回ります。効率的なコードを書くことは重要ですが、それでも人間が読める必要があります。

免責事項:一部のドメインでは、数学演算の数が多く、これが要因になる可能性がありますが、これは確かに標準ではありません

于 2012-05-22T15:23:18.663 に答える