Javaコンパイラが簡単なメソッドを最適化しないのはなぜですか?

ドラガンボザノビッチ

説明のための簡単なクラスがあります。

public class Test {

    public int test1() {
        int result = 100;
        result = 200;
        return result;
    }

    public int test2() {
        return 200;
    }
}

コンパイラによって生成されるバイトコード(によって検査されるjavap -c Test.class)は次のとおりです。

public int test1();
Code:
   0: bipush        100
   2: istore_1
   3: sipush        200
   6: istore_1
   7: iload_1
   8: ireturn

public int test2();
Code:
   0: sipush        200
   3: ireturn

コンパイラがtest1メソッド用に生成されたのと同じバイトコードにメソッドを最適化しないのはなぜtest2ですか?result100がまったく使用されていないと簡単に結論付けられることを考えると、少なくとも変数の冗長な初期化を回避できると思います。

私はこれをEclipseコンパイラとの両方で観察しましたjavac

javacバージョン:1.8.0_72、Javaと一緒にJDKの一部としてインストールされます:

Java(TM) SE Runtime Environment (build 1.8.0_72-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.72-b15, mixed mode)
ラファエルウィンターハルター

一般的なJava仮想マシンは、コンパイル中ではなく、実行時にプログラムを最適化します。実行時に、JVMは、プログラムの実際の動作とプログラムが実行される実際のハードウェアの両方について、アプリケーションについて多くのことを認識します。

バイトコードは、プログラムがどのように動作するかを説明したものにすぎません。ランタイムは、バイトコードに最適化を自由に適用できます。

もちろん、このような些細な最適化はコンパイル中でも適用できると主張することはできますが、一般に、最適化を複数のステップに分散しないことは理にかなっています。最適化を行うと、元のプログラムに関する大量の情報が事実上発生し、他の最適化が不可能になる可能性があります。とはいえ、すべての「最良の最適化」が常に明白であるとは限りません。これに対する簡単なアプローチは、コンパイル中に(ほぼ)すべての最適化を削除し、代わりに実行時にそれらを適用することです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

C#コンパイラが単純なasync / awaitメソッドを最適化しないのはなぜですか

分類Dev

コンパイラがこのコードを最適化しないのはなぜですか

分類Dev

コンパイラが割り込みコードを最適化しないのはなぜですか?

分類Dev

値渡しパラメーターがコンパイラーのコード最適化を容易にすることが多いのはなぜですか?

分類Dev

コンパイラがこの初期化を最適化しないのはなぜですか?

分類Dev

JITの最適化解除、reason = "constraint"。JITがメソッドを最適化しないのはなぜですか?

分類Dev

コンパイラがこの負荷を最適化しないのはなぜですか

分類Dev

C ++コンパイラが未使用の参照変数を最適化しないのはなぜですか?

分類Dev

小さなラップされたメソッドが最適化されないのはなぜですか?

分類Dev

C ++コンパイラがこれらのメモリ書き込みを最適化しないのはなぜですか?

分類Dev

JVM /コンパイラは単純なスーパーメソッド呼び出しを最適化しますか?

分類Dev

このC ++コードがMicrosoftコンパイラでのみあいまいなメソッド呼び出しを行うのはなぜですか?

分類Dev

コードをコンパイルしようとすると、あいまいなメソッドエラーが発生するのはなぜですか?

分類Dev

メソッド内にIIB(インスタンス初期化ブロック)を作成できますか?なぜコンパイル時エラーが発生しないのかわからない場合はどうすればよいですか?

分類Dev

なぜFinal変数はJavaのメインメソッドで初期化を必要としないのですか?

分類Dev

java.baseの一部のメソッドがAOTコンパイラーでコンパイルできないのはなぜですか

分類Dev

コンパイラがインライン化によってクロージャ変数を最適化できないのはなぜですか?

分類Dev

この非同期メソッドにコンパイルエラーがないのはなぜですか?

分類Dev

C ++コンパイラがこの条件付きブール割り当てを無条件割り当てとして最適化しないのはなぜですか?

分類Dev

C ++コンパイラがこの条件付きブール割り当てを無条件割り当てとして最適化しないのはなぜですか?

分類Dev

C99コンパイラがブール値の「!a && b」を「a <b」として最適化しないのはなぜですか?

分類Dev

Java8:参照メソッドが静的でないのに、参照メソッドがコンパイルされないのはなぜですか?

分類Dev

C最適化:コンパイラがオブジェクトを定数として扱わないのはなぜですか?

分類Dev

メソッドパラメータを再定義してもコンパイルエラーにならないのはなぜですか?

分類Dev

Javaが静的メソッドのオーバーライドを許可しないのはなぜですか?

分類Dev

Rustコンパイラーは、2つの可変参照がエイリアスできないと想定してコードを最適化しないのはなぜですか?

分類Dev

VS 2015コンパイラが浮動小数点数のabs()実装でブランチを最適化できないのはなぜですか?

分類Dev

コンパイラが予測可能な加算ループを乗算に最適化できない(または最適化しない)のはなぜですか?

分類Dev

メインメソッドを含むクラスがJavaでパブリックである必要がないのはなぜですか?

Related 関連記事

  1. 1

    C#コンパイラが単純なasync / awaitメソッドを最適化しないのはなぜですか

  2. 2

    コンパイラがこのコードを最適化しないのはなぜですか

  3. 3

    コンパイラが割り込みコードを最適化しないのはなぜですか?

  4. 4

    値渡しパラメーターがコンパイラーのコード最適化を容易にすることが多いのはなぜですか?

  5. 5

    コンパイラがこの初期化を最適化しないのはなぜですか?

  6. 6

    JITの最適化解除、reason = "constraint"。JITがメソッドを最適化しないのはなぜですか?

  7. 7

    コンパイラがこの負荷を最適化しないのはなぜですか

  8. 8

    C ++コンパイラが未使用の参照変数を最適化しないのはなぜですか?

  9. 9

    小さなラップされたメソッドが最適化されないのはなぜですか?

  10. 10

    C ++コンパイラがこれらのメモリ書き込みを最適化しないのはなぜですか?

  11. 11

    JVM /コンパイラは単純なスーパーメソッド呼び出しを最適化しますか?

  12. 12

    このC ++コードがMicrosoftコンパイラでのみあいまいなメソッド呼び出しを行うのはなぜですか?

  13. 13

    コードをコンパイルしようとすると、あいまいなメソッドエラーが発生するのはなぜですか?

  14. 14

    メソッド内にIIB(インスタンス初期化ブロック)を作成できますか?なぜコンパイル時エラーが発生しないのかわからない場合はどうすればよいですか?

  15. 15

    なぜFinal変数はJavaのメインメソッドで初期化を必要としないのですか?

  16. 16

    java.baseの一部のメソッドがAOTコンパイラーでコンパイルできないのはなぜですか

  17. 17

    コンパイラがインライン化によってクロージャ変数を最適化できないのはなぜですか?

  18. 18

    この非同期メソッドにコンパイルエラーがないのはなぜですか?

  19. 19

    C ++コンパイラがこの条件付きブール割り当てを無条件割り当てとして最適化しないのはなぜですか?

  20. 20

    C ++コンパイラがこの条件付きブール割り当てを無条件割り当てとして最適化しないのはなぜですか?

  21. 21

    C99コンパイラがブール値の「!a && b」を「a <b」として最適化しないのはなぜですか?

  22. 22

    Java8:参照メソッドが静的でないのに、参照メソッドがコンパイルされないのはなぜですか?

  23. 23

    C最適化:コンパイラがオブジェクトを定数として扱わないのはなぜですか?

  24. 24

    メソッドパラメータを再定義してもコンパイルエラーにならないのはなぜですか?

  25. 25

    Javaが静的メソッドのオーバーライドを許可しないのはなぜですか?

  26. 26

    Rustコンパイラーは、2つの可変参照がエイリアスできないと想定してコードを最適化しないのはなぜですか?

  27. 27

    VS 2015コンパイラが浮動小数点数のabs()実装でブランチを最適化できないのはなぜですか?

  28. 28

    コンパイラが予測可能な加算ループを乗算に最適化できない(または最適化しない)のはなぜですか?

  29. 29

    メインメソッドを含むクラスがJavaでパブリックである必要がないのはなぜですか?

ホットタグ

アーカイブ