このコードを実行すると、予期しない結果が得られます。プリミティブを追加するループははるかに高速に実行されると期待していますが、結果は一致しません。
import java.util.*;
public class Main {
public static void main(String[] args) {
StringBuilder output = new StringBuilder();
long start = System.currentTimeMillis();
long limit = 1000000000; //10^9
long value = 0;
for(long i = 0; i < limit; ++i){}
long i;
output.append("Base time\n");
output.append(System.currentTimeMillis() - start + "ms\n");
start = System.currentTimeMillis();
for(long j = 0; j < limit; ++j) {
value = value + j;
}
output.append("Using longs\n");
output.append(System.currentTimeMillis() - start + "ms\n");
start = System.currentTimeMillis();
value = 0;
for(long k = 0; k < limit; ++k) {
value = value + (new Long(k));
}
output.append("Using Longs\n");
output.append(System.currentTimeMillis() - start + "ms\n");
System.out.print(output);
}
}
出力:
基本時間 359ms long を使用 1842ms Long を使用 614ms
独自の Java プログラムで個々のテストを実行しようとしましたが、結果は同じです。何が原因でしょうか?
詳細: Java 1.6 の実行
編集: 他の 2 人にこのコードを試すように依頼しましたが、1 人は私とまったく同じ奇妙な結果を得ました。もう 1 つは、実際に意味のある結果が得られます。私は、正常な結果を得た人に、彼のクラス バイナリを提供するように依頼しました。それを実行しても、まだ奇妙な結果が得られます。問題はコンパイル時ではありません(私は思います)。私は 1.6.0_31 を実行しています。正常な結果が得られるのは 1.6.0_16 で、私のように奇妙な結果が得られるのは 1.7.0_04 です。
編集: プログラムの開始時に Thread.sleep(5000) で同じ結果を取得します。また、プログラム全体を while ループしても同じ結果が得られます (Java が完全に起動された後、時間が通常の時間に収束するかどうかを確認するため)。