对于长间隔,System.nanoTime()仍然不可靠吗?

时间:2015-09-05 00:30:25

标签: java time

关于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() + "********************");
}

Time drift plot

该图显示实时和纳米时间之间令人惊讶的一致负相关。摇摆的红线是实际数据,绿色是趋势线(具有拟合方程)。在我的情况下,纳米时间运行速度慢到0.01 ms / s。如果纳米时间是受到硬中断和软中断的cpu计数器,这就是我所期望的。

我只设法将我的纳米时间实现追溯到public static native long currentTimeMillis()。之后它下降到C&amp;神秘。我无法理解为什么如果你有一个ntp锁定的实时时钟,纳米时间不会同步到它。

你能依靠System.nanoTime()获取任何&gt;几秒钟呢?

0 个答案:

没有答案