我正在尝试使用 System.nanoTime()
和 System.currentTimeMillis()
测量某个时期的持续时间。周期越长,我从两次测量中获得的差异就越大。
这是一个演示问题的小片段:
public class TimeTest {
public static void main(String[] args) throws Exception {
long startNanos = System.nanoTime();
long startMillis = System.currentTimeMillis();
while (true) {
long nowNanos = System.nanoTime();
long nowMillis = System.currentTimeMillis();
System.out.println((nowMillis - startMillis) - (nowNanos - startNanos) / 1000000);
Thread.sleep(100);
}
}
}
在带有 jdk 1.8.0_74 的 Mac OS 上运行时,有一个明显的趋势,即值每分钟减少约 2 毫秒。 IE。一开始我只看到 0 和 1,但 10 分钟后出现了大约 -20 的值。
我设法仅在使用 jdk8 的 mac 上观察到这种行为,无法在同时使用 jdk 7 和 8 的 linux 和 windows 上重现它。
那么,问题是:谁在说谎?我知道应该首选 nanoTime()
来测量持续时间。但在这种情况下,我不确定这是真的。
有人可以详细说明这个话题吗?
最佳答案
如果您使用的是 NTP,则很可能您的 currentTimeMillis 已被更正,因此它最有可能是正确的。 nanoTime() 基于时钟周期/时钟频率。如果此频率略微偏离它测量的频率,您将看到持续漂移。这不应基于 Java 版本,而应基于操作系统和硬件。
关于java - nanoTime 和 currentTimeMillis 在 Mac OS 上有不同的速率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37417268/