2009-04-29 17 views
6

NoJavaコンパイラによって生成されるバイトコードを調べる必要がありますか?

  • JITコンパイラは、とにかく完全に異なるものにバイトコードを「変換」があります。
  • これは早すぎる最適化につながります。

Yes

  • あなたは、JITによってコンパイルされる方法がわからないので、あなたがそれらすべてを最適化するかどうかは良いです。
  • これは、より良いJavaプログラマーになります。

本当に分かりません(明らかに)ので、私はJITのハイパーリンクにリダイレクトすることを自由に感じています。

答えて

17

はい、しかしある程度です - それはボンネットの下で何が起こっているのかを見るための教育機会としては良いですが、おそらく適度に行うべきです。

バイトコードを見ると、JavaソースコードをJavaバイトコードにコンパイルする方法を理解するのに役立ちます。また、コンパイラによって実行される最適化の種類や、コンパイラが実行できる最適化の量にいくつかの制限があるかもしれません。例えば

文字列の連結が行われた場合、javacStringBuilderを使用しString Sを連結するappend方法を実施するに連結を最適化します。文字列の連結をループ内で実行される場合

しかし、新しいStringBuilderを手動ループ外StringBuilderをインスタンスのみループ内append Sを実施するために比較可能な性能低下につながる、各反復でインスタンス化することができます。

JITの問題について。ジャストインタイムコンパイルはJVM実装固有のものになるため、バイトコードがネイティブコードに変換されているときに実際に何が起こっているかを知ることは非常に容易ではなく、さらに、 JITコンパイルが実行されているかどうかを確認するためにJVM固有のツールがなくても、少なくとも私はこの点について詳しくは分かりませんので、ちょうど推測しています)。

しかし、とにかくJVMはバイトコードを実行しようとしています。実行される方法は、開発者にとって多かれ少なかれ不透明であり、JVMに固有です。あるJVMが実行している間に別のJVMが実行するいくつかのパフォーマンス・トリックがあるかもしれません。

生成されたバイトコードを調べる問題になると、バイトコードにコンパイルされたときに実際にソースコードに何が起こっているかを知ることになります。コンパイラによって実行される最適化の種類を見ることができるだけでなく、コンパイラが最適化を実行できる方法に制限があることを理解することもできます。

私は、バイトコードの世代と、最も最適化されたバイトコードを生成するプログラムを書くことに執着することは、本当に良い考えではないと言いました。もっと重要なのは、他の人が読みやすく保守可能なJavaソースコードを書くことです。

4

これは、あなたが何をしようとしているかによってまったく異なります。メソッド/モジュールを最適化しようとしている場合、バイトコードを見ることは時間の無駄になります。ボトルネックがどこにあるかを見つけるためにまずプロファイルを作成し、ボトルネックを最適化します。あなたのボトルネックが可能な限り厳しいように見え、より速くする必要がある場合は、ネイティブコードでそれを書き換えてJNIとインターフェースするしかありません。

生成されたバイトコードを最適化しようとすると、ほとんど役に立ちません。JITコンパイラは多くの作業を行うため、正確に何をしているのか分かりません。

1

私はそうは思わないでしょう。 javacコンパイラをデバッグするのに手間がかかったり、関心事として知りたいのではないのに、なぜバイトコードが生成されるのか誰かが気にする理由があるとは思いません。

バイトコードを知っていても、内燃機関の動作がわかるよりも優れたJavaプログラマーになるとは限りません。

抽象概念を考えてみましょう。惑星の軌道を計算しようとするとき、クォークや原子の作用について知る必要はありません。良いJavaプログラマになるためには、おそらくJavaを学ぶべきです。Java。はい、Javaです:-)

+0

しかし、車の内部構造について学ぶと、Cole Trickleはより良いドライバーになりました。 – Boune

0

大容量のサーバーを開発していない限り、好奇心を除いてバイトコードを調べる必要はありません。組織の許容コーディングプラクティスに準拠したソースコードは、ほとんどのアプリケーションで十分なパフォーマンスを提供します。

アプリケーションの負荷テスト後に問題が発生するまで、またはカスタマーサービス担当者全員がその画面を読み込んで「永遠に」ロードするようになるまで、パフォーマンスが低下することはありません。次に、ボトルネックを解消し、残りのコードだけを残しておきます。

バイトコードは、理解するのに適度な学習曲線を必要とします。確かに、それ以上のことを学ぶことは決して痛いことではありませんが、実用主義はそれが必要になるまでそれを取り除くことを示唆しています。 (そしてその瞬間が来たら、私はあなたを指導する人を見つけることをお勧めします)

+0

バイトコードを調べると、ほとんどパフォーマンスがわかりません。 (javacが何か高いレベルの文字列連結とボクシングを行っている場合の例外)。 –

関連する問題