32

重複の可能性:
ビットのシフトは、Java での乗算と除算よりも高速ですか? 。ネット?
Java最適化に関する簡単な質問

何年も前に大学で、ビットを右に 1 シフトすると 2 で除算するのと同じ結果が得られることを学びましたが、一般的にははるかに高速です。9 ~ 10 年前にそのことを知って以来、Java がその点でどのように発展してきたかはわかりません。Java コンパイラは自動的に 2 除算をビット シフト演算に変換しますか? それとも、コード内で手動でビット シフト演算を実行する必要がありますか?

4

4 に答える 4

68

ビットシフトが一般的なショップやコードベースで作業しているのでない限り、私見では、難読化のリスクがあります。はい、式は論理的に同等かもしれませんが:

  • n00bは、代替構文によって混乱する可能性があります
  • 私のように大学時代から少しシフトする必要がなかった老人は混乱するかもしれません
  • あなたが少しシフトして、あなたが今したことについてコメントする必要を感じるなら、あなたは間違いなくオフです。単純な除算は自己文書化であり、初等数学に精通している人なら誰でも明らかです。
  • 単純なものを最適化するためにコンパイラーを凌駕するつもりはないので、わざわざ試してはいけません。
  • 優れたコーディング慣行として、賢い(er)よりもコードをシンプル/バニラにする方が良いです

これはすべて相対的なものであり、繰り返しになりますが、実際にはショップの基準に依存します。あなたの同僚がビットシフトを愛するなら、ぜひ前に出てビットシフトしてください。

于 2010-11-01T20:17:49.257 に答える
22

はい、これはコンパイラの最適化を行おうとする人が最初に行うことです(そして、少なくとも50年間行ってきました)。これは、Java JITコンパイラによって行われることは間違いありません。おそらく、見つけるのは非常に難しいでしょう。それを行わないコンパイラ。

そして、そうでなかったとしても、コードをより明確にするために避けるべきは時期尚早のマイクロ最適化です。

于 2010-11-01T20:20:25.447 に答える
19

最新のコンパイラは、2で除算するための最速のコードを生成するのに十分賢いです。それが速い場合、彼らはシフトを行います。達成したいことが2による除算である場合、除算を使用するとコードがより明確になります。また、分割する数が負の場合の問題を回避できます。

于 2010-11-01T20:19:26.993 に答える
10

CPUの分割ルーチンがこれを処理します。あなたがそれをする必要はありません。

これは、時期尚早の最適化として知られています。

于 2010-11-01T20:17:53.073 に答える