ウォームアップ フェーズを実行しない場合、最初のループは最適化およびコンパイルされますが、2 番目のループはコンパイルされない可能性があります。一方、それらをマージすると、マージされたループ全体がコンパイルされます。また、server
オプションとコードを使用すると、結果を使用しないため、ほとんどが最適化されます。
以下のテストを実行し、各ループとマージされたループを独自のメソッドに配置し、JVM をウォームアップして、すべてがコンパイルされることを確認しました。
結果 (JVM オプション: -server -XX:+PrintCompilation
):
- ループ 1 = 500ms
- ループ 2 = 900 ミリ秒
- マージされたループ = 1,300 ミリ秒
そのため、マージされたループはわずかに高速ですが、それほどではありません。
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 3; i++) {
loop1();
loop2();
loopBoth();
}
long start = System.nanoTime();
loop1();
long end = System.nanoTime();
System.out.println((end - start) / 1000000);
start = System.nanoTime();
loop2();
end = System.nanoTime();
System.out.println((end - start) / 1000000);
start = System.nanoTime();
loopBoth();
end = System.nanoTime();
System.out.println((end - start) / 1000000);
}
public static void loop1() {
int a = 188, aMax = 0;
for (int i = 0; i < 1000000000; i++) {
int t = a ^ i;
if (t > aMax) {
aMax = t;
}
}
System.out.println(aMax);
}
public static void loop2() {
int b = 144, bMax = 0;
for (int i = 0; i < 1000000000; i++) {
int t = b ^ i;
if (t > bMax) {
bMax = t;
}
}
System.out.println(bMax);
}
public static void loopBoth() {
int a = 188, b = 144, aMax = 0, bMax = 0;
for (int i = 0; i < 1000000000; i++) {
int t = a ^ i;
if (t > aMax) {
aMax = t;
}
int u = b ^ i;
if (u > bMax) {
bMax = u;
}
}
System.out.println(aMax);
System.out.println(bMax);
}