java - nanoTime 和 currentTimeMillis 在 Mac OS 上有不同的速率

标签 java macos

我正在尝试使用 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/

相关文章:

java - Play Framework : Mixing Java and Scala controller/views

JavaScript 未在 WKWebView 中执行

xcode - 将 Xcode 5 文件模板值更改为 ___FULLUSERNAME___

objective-c - 如何在 Cocoa Objective-c 中创建 UI 标签?

java - Spring Rest Web 服务将文件作为资源返回

java - 有没有办法返回组合为一个对象的一组对象?

java - 如何使用 Apache POI 将 altChunk 元素添加到 XWPFDocument

javascript - 将 Apple 应用内购买添加到 Electron HTML/JS 应用

objective-c - NSWindow keyDown : crashes

java - Java 的 CopyOnWriteLinkedList 实现