关于Java的System.nanoTime()的准确性,已有一些先前的争论。底层实现似乎随着内核和工具包而发展。它似乎与机器上的实际时间没有完全相关。我在睡觉时用了5个小时运行了以下代码。然后我绘制了结果。它是Java 7 / Windows 7.
public static void main(String[] args) throws InterruptedException {
System.out.println(System.currentTimeMillis() + "********************");
long baseMillis = System.currentTimeMillis();
long baseNanos = System.nanoTime();
for (int i = 0; i < 100; i++) { // 5 hours overall
Thread.sleep(180_000);
long deltaMillis = System.currentTimeMillis() - baseMillis;
long deltaNanos = System.nanoTime() - baseNanos;
long delta = deltaMillis * 1_000_000 - deltaNanos; // In nS
System.out.println(delta);
}
System.out.println(System.currentTimeMillis() + "********************");
}
该图显示实时和纳米时间之间令人惊讶的一致负相关。摇摆的红线是实际数据,绿色是趋势线(具有拟合方程)。在我的情况下,纳米时间运行速度慢到0.01 ms / s。如果纳米时间是受到硬中断和软中断的cpu计数器,这就是我所期望的。
我只设法将我的纳米时间实现追溯到public static native long currentTimeMillis()
。之后它下降到C&amp;神秘。我无法理解为什么如果你有一个ntp锁定的实时时钟,纳米时间不会同步到它。
你能依靠System.nanoTime()获取任何&gt;几秒钟呢?