【发布时间】:2015-02-17 13:41:54
【问题描述】:
我注意到 System.nanoTime() 的一个模式。每次我开始迭代时,nanoTime() 都会在几圈内变得非常不正确,直到它最终稳定下来。
例如,如果我运行以下代码:
public class TimeTest{
public static void main(String[] args) {
long prev = System.nanoTime();
for(int i = 0; i < 10; i++) {
for(int j = 0; j < 1000000; j++);
long time = System.nanoTime();
System.out.println(time - prev);
prev = time;
}
}
}
我得到以下结果:
为了消除 System.out.println(String) 弄乱结果的可能性,我还可以运行以下测试:
public class TimeTest{
public static void main(String[] args) {
long[] difs = new long[10];
long prev = System.nanoTime();
for(int i = 0; i < 10; i++) {
for(int j = 0; j < 1000000; j++);
long time = System.nanoTime();
difs[i] = (time - prev);
prev = time;
}
for(long l : difs)
System.out.println(l);
}
}
结果如下:
初始延迟可以通过假设迭代的开始(在本例中为 for 循环)在循环开始之前需要一些额外的时间来初始化来解释。但是,由于据说第二圈也需要很长时间才能执行,因此我们可以相信它毕竟不是 for-loop。
所以我的问题很简单,当使用 System.nanoTime() 和迭代时,是什么导致了这种初始延迟?
注意:我也尝试了不同类型的迭代器,但问题仍然存在。
【问题讨论】:
-
不要责怪
nanoTime()。时间是真实的。 -
您使用什么 Java 版本的 JDK 或 JRE 进行测试?对于所有循环,我得到几乎相同的结果。 (JDK 1.7,Win 7 64 位)
-
JDK 8.0、JRE 1.7.0、OS X Mavericks 32 位