Javaの定数ループのパフォーマンスの最適化

Alperen生成:

私は、コードの2枚を持っています。

最初の1つ:

List<Integer> integers = new ArrayList<>();
integers.add(0);
integers.add(1);
//Assume that list will always have the same values with loop indices.
//Also any of the methods will not change the size and elements of the list.

for (int i=0;i<integers.size();i++) {

    if (0 == integers.get(i)) {
        foo();
    }
    else if (1 == integers.get(i)) {
        bar();
    }
}

二つ目:

foo();
bar();

私は両方のコードスニペットは、同じことをやっている知っているが、性能の違いがありますかJVMは、コンパイル時または実行時に最初のスニペットを最適化するために何かをやっていますか?

ハルク:

コンパイラ/ JITは、最初のスニペットのために多くを行うことができなくなります。

それは、連続通話がしていることを証明することはできませんintegers.get(i)最初の呼び出しの結果を再利用することが許可されていないので、常に同じ結果が得られると、それものその1を言うことができないfoo()か、bar()常に実行されます。

コードは、人間のためのシンプルな十分に表示されますが、コンパイラがの実装についての仮定にする必要がありますArrayListそれは実行時にロードされ、それはそれを行うことはありません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=236806&siteId=1