No
- とにかく、JITコンパイラはバイトコードをまったく異なるものに「変換」する可能性があります。
- 時期尚早の最適化を行うことになります。
Yes
- どのメソッドが JIT でコンパイルされるかわからないので、すべて最適化した方がよいでしょう。
- それはあなたをより良い Java プログラマーにします。
(明らかに)よくわからないまま質問しているので、JITハイパーリンクにリダイレクトしてください。
No
Yes
(明らかに)よくわからないまま質問しているので、JITハイパーリンクにリダイレクトしてください。
はい、しかしある程度は - ボンネットの下で何が起こっているかを見るための教育の機会としては良いですが、おそらく適度に行われるべきです.
バイトコードを見ると、Java ソース コードがどのように Java バイトコードにコンパイルされるかを理解するのに役立つ可能性があるため、これは良いことです。また、コンパイラによって実行される最適化の種類と、コンパイラが実行できる最適化の量に対するいくつかの制限について、いくつかのアイデアが得られる場合があります。
たとえば、文字列の連結が実行される場合、javac
は連結を最適化して、 を使用し、メソッドをStringBuilder
実行して を連結します。append
String
ただし、文字列の連結がループ内で実行される場合、反復ごとに newがインスタンス化される可能性があり、ループの外側で手動でインスタンス化してループ内でのみ s を実行するStringBuilder
場合と比較して、パフォーマンスが低下する可能性があります。StringBuilder
append
JITの問題について。ジャストインタイム コンパイルは JVM 実装に固有のものになるため、ネイティブ コードに変換されているときにバイトコードに実際に何が起こっているかを見つけるのは非常に簡単ではありません。 JITされています(少なくとも、実行されているJITコンパイルの種類を確認するためのJVM固有のツールがないわけではありません-この分野の詳細はわかりませんので、推測しているだけです。)
とは言っても、JVM はとにかくバイトコードを実行しようとしています。それが実行される方法は、開発者にとって多かれ少なかれ不透明であり、やはり JVM 固有です。ある JVM では実行され、別の JVM では実行されないパフォーマンス トリックがいくつかある場合があります。
生成されたバイトコードを見るという問題になると、バイトコードにコンパイルされたときにソースコードに実際に何が起こっているかを知ることになります。コンパイラーによって実行される最適化の種類を確認できますが、コンパイラーが実行できる最適化の方法には限界があることも理解できます。
とはいえ、バイトコードの生成に執着し、最適化されたバイトコードを生成するプログラムを作成しようとするのは、本当に良い考えではないと思います。さらに重要なことは、他の人が読みやすく保守しやすい Java ソース コードを作成することです。
それは、あなたが何をしようとしているかに完全に依存します。メソッド/モジュールを最適化しようとしている場合、バイトコードを見るのは時間の無駄になります。常に最初にプロファイリングしてボトルネックがどこにあるかを見つけ、次にボトルネックを最適化します。ボトルネックが可能な限りタイトであり、それを高速化する必要がある場合は、ネイティブ コードでそれを書き直し、JNI と連携するしかない場合があります。
生成されたバイトコードを最適化しようとしても、ほとんど役に立ちません。JIT コンパイラーは多くの作業を行い、それが何をしているのか正確にはわからないからです。
なんらかの大容量サーバーを開発している場合を除き、好奇心以外でバイトコードを調べる必要はないでしょう。組織で受け入れられるコーディング プラクティスに準拠するソース コードは、ほとんどのアプリケーションで十分なパフォーマンスを提供します。
アプリケーションの負荷テストを行った後に問題が見つかるまで、パフォーマンスについて心配する必要はありません (または、カスタマー サービス全体が、読み込みに「永遠に」かかる画面であなたをリンチします)。次に、ボトルネックを叩きのめし、残りのコードはそのままにしておきます。
バイトコードを理解するには、ある程度の学習曲線が必要です。確かに、もっと学ぶことは決して悪いことではありませんが、プラグマティズムは、必要になるまでそれを先延ばしにすることを提案しています. (そして、その瞬間が来たら、メンターになる人を見つけることをお勧めします。)