2015-12-30 10 views
13

私は1.5の互換性のあるJavaソースを持っています。これは1.8 VMでのみ動作し、古いバージョンではなくコンパイル時に1.8をターゲットにするのが有益かどうか疑問です。異なるJavaバージョンを対象とするソースコードのパフォーマンスの違いはありますか?

1.5と1.8の間にパフォーマンスの違いはありますか? 関連文書や変更履歴がありますか? 1.5

は、JavaFXの、NIO、lambasとして1.8の新しいAPIもありますので、あなたが固定されている千のバグ修正を検討すべきパフォーマンスを除き

+0

Java 8クラスファイルがJava 8 JVM上のJava 5クラスファイルより速くなるか、Java 8 JVM上のJava 8クラスファイルがJava 5 JVM上のJava 5クラスファイルより高速かどうか尋ねられますか? – meriton

+0

@meriton最初のもの – orom

答えて

3

javacはほとんど最適化を行いません。主な最適化は一定のインライン展開であり、常にこれを行っています。

違いはすべてJVMにあります。 Java 8では、同じコードを書くための選択肢が増えています。つまり、コードを書き直して効率を上げることができます。

0

Oracleはスイングがもう更新されないと発表しました。アプリケーションにGUIがある場合は、javafxへの移植を開始することを検討する必要があります。新しいJDKをダウンロードするときに、Oracleサイトで

はところで、あなたが参照しているコンパイルされたJavaコードは、新しいJVMのバージョンで古いアプリケーションを実行して、Javaのバイトコードであるので、それへのリンクは変更履歴

+0

バグ修正についての良い点がありますが、私はさまざまなターゲット用に生成されたバイトコードのパフォーマンスの違いについて詳しく知りました。 アプリケーションにGUIがありません。 – orom

+0

ThreはJava 1.6から新しいガベージコレクタを効率的に使用しています。ホットスポットはx64でも書き直されました。他の情報は、私が推測するより多くのoracleの内部秘密であり、あなた自身でいくつかのテストを行うことによってのみ比較することができます –

7

だもあります(1.8)は、バイトコードの再コンパイルを必要とせずにアプリケーションのパフォーマンスを向上させるはずです。

変更された内容を理解するために、JDK 8 performance improvementに関するオフィシャルオラクルのドキュメントを参照してください。

+2

しかし、より新しいターゲットのために生成されたバイトコードは「より良い」ものでしょうか?私はいくつかのクラスを逆コンパイルし、1.5対1.8をターゲットにした場合、バイトコードの間には明らかに違いがあります。 私はJDKのchnagelogsを見てきましたが、そこにjavacのパフォーマンスに関連する変更の特定のバージョンがある場合は要約版がありました。 – orom

+1

大きな違いはないはずですが、潜在的な違いはありますが、それほど目立たないかもしれません。新しい最適化されたデータ構造などを利用するためにコードを変更する場合は異なります。 – aleroot

+0

将来、いくつかの小さな方法で、多くはないかもしれません。たとえば、Java 9ではinvokedynamicを使用するように文字列連結をコンパイルする方法が変更される予定です。これはJava 7以上をターゲットとする場合にのみ使用できます。 –

1

私は通常、1.7にコンパイルを設定します。新しいラムダ構文は、Java 8の他の機能の中でもいいですが、私はJava 7との互換性の問題がはるかに少なくなります。

VMを使用して自分自身で作業し、問題を引き起こすフレームワークに頼っていないことがわかっている場合は、必ずJava 8を起動してください。 公式のドキュメントをチェックすることもできますウィキペディアは実際に素晴らしい変更ログを提供します: https://en.wikipedia.org/wiki/Java_version_history

1

Java 7と以前のバージョンとの互換性について説明したthis Oracle sourceが見つかりました。バージョン7と6との間の(バイトコード)差異としてinvokedynamicバイトコードのみが言及されている。バイトコードは実際にそれほど変わらないので、パフォーマンスのバージョン5バイトコード対バージョン8バイトコードの影響は無視できる。

+1

'invokedynamic'は(IIRC)JVMが導入されて以来、バイトコードへの唯一の*実数(または少なくとも唯一の重要な)変更であったので、言及することは間違いありません。しかし、私はパフォーマンスにどのような影響があるのか​​よくわかりません。彼らは「無視できる」と言いましたが、パフォーマンスの違いはどこにありますか?そしてどれくらい大きくなるのでしょうか? – Marco13

+1

[this](http://www.javaworld.com/article/2860079/scripting-jvm-languages/invokedynamic-101.html)によれば、実際にはinvokedynamicの理由はパフォーマンスでした。 Javaのパフォーマンスだけでなく、JVM上で動作する他の動的言語。 – Kayaman

関連する問題