なぜこのコード
long s, e, sum1 = 0, sum2 = 0, TRIALS = 10000000;
for(long i=0; i<TRIALS; i++) {
s = System.nanoTime();
e = System.nanoTime();
sum1 += e - s;
s = System.nanoTime();
e = System.nanoTime();
sum2 += e - s;
}
System.out.println(sum1 / TRIALS);
System.out.println(sum2 / TRIALS);
この結果を生成します
-60
61
「私のマシンで?」
編集:
Sam I am's answerは、役立つ nanoSecond() ドキュメントを指していますが、より正確には、結果が一貫して最初の合計を支持するのはなぜですか?
「私のマシン」:
JavaSE-1.7、Eclipse
Win 7 x64、AMD Athlon II X4 635
ループ内で順番を入れ替えると逆の結果になる
for(int i=0; i<TRIALS; i++) {
s = System.nanoTime();
e = System.nanoTime();
sum2 += e - s;
s = System.nanoTime();
e = System.nanoTime();
sum1 += e - s;
}
61
-61
sum1 に追加する前に (es) を調べると、sum1 が正になります。
for(long i=0; i<TRIALS; i++) {
s = System.nanoTime();
e = System.nanoTime();
temp = e-s;
if(temp < 0)
count++;
sum1 += temp;
s = System.nanoTime();
e = System.nanoTime();
sum2 += e - s;
}
61
61
アンドリュー・アルコックが指摘するように、sum1 += -s + e は期待される結果を生成します。
for(long i=0; i<TRIALS; i++) {
s = System.nanoTime();
e = System.nanoTime();
sum1 += -s + e;
s = System.nanoTime();
e = System.nanoTime();
sum2 += -s + e;
}
61
61
その他のいくつかのテスト: http://pastebin.com/QJ93NZxP