Java-virtual-machine-jit-optimisations

提供:Dev Guides
移動先:案内検索

Java仮想マシン-JITの最適化

この章では、JIT最適化について学習します。

メソッドのインライン化

この最適化手法では、コンパイラーは関数呼び出しを関数本体に置き換えることを決定します。 以下は同じものの例です-

int sum3;

static int add(int a, int b) {
   return a + b;
}

public static void main(String…args) {
   sum3 = add(5,7) + add(4,2);
}

//after method inlining
public static void main(String…args) {
   sum3 = 5+ 7 + 4 + 2;
}

この手法を使用すると、コンパイラーは関数呼び出しのオーバーヘッドからマシンを節約します(パラメーターをスタックにプッシュおよびポップする必要があります)。 したがって、生成されたコードはより高速に実行されます。

メソッドのインライン化は、非仮想関数(オーバーライドされない関数)に対してのみ実行できます。 「add」メソッドがサブクラスでオーバーライドされ、メソッドを含むオブジェクトのタイプが実行時までわからない場合はどうなるかを考えてください。 この場合、コンパイラはインライン化するメソッドを認識しません。 しかし、メソッドが「最終」としてマークされている場合、コンパイラは、サブクラスでオーバーライドできないため、インラインにできることを容易に認識します。 最終メソッドが常にインライン化されることはまったく保証されないことに注意してください。

到達不能およびデッドコードの排除

到達不能コードとは、実行フローによって到達できないコードです。 私たちは次の例を検討します-

void foo() {
   if (a) return;
   else return;
   foobar(a,b);//unreachable code, compile time error
}

デッドコードも到達不能コードですが、この場合、コンパイラはエラーを吐き出します。 代わりに、警告が表示されます。 コンストラクター、関数、try、catch、if、whileなどの各コードブロックには、JLS(Java Language Specification)で定義された到達不能コードに関する独自のルールがあります。

一定の折りたたみ

定数の折りたたみの概念を理解するには、以下の例を参照してください。

final int num = 5;
int b = num * 6;//compile-time constant, num never changes
//compiler would assign b a value of 30.