为什么这段代码
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 的回答指向 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
正如 Andrew Alcock 指出的那样, 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