説明のための簡単なクラスがあります。
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
ですか?result
値100
がまったく使用されていないと簡単に結論付けられることを考えると、少なくとも変数の冗長な初期化を回避できると思います。
私はこれを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]
コメントを追加