比较不同计算机生成的System.nanoTime()值

时间:2011-11-03 19:45:15

标签: java distributed-computing nanotime time-precision

在两台不同的机器上比较调用System.nanoTime()得到的两个值是否正确?我会说不,因为System.nanoTime()通过使用与处理器相关的Time Stamp Counter (TSC)返回相对于某个任意点时间的纳秒精确时间。

如果我是对的,有没有办法(在Java中)在两台不同的机器上捕捉瞬间并比较(安全地)这些值至少达到微秒精度甚至纳米级精度?

System.currentTimeMillis()不是解决方案,因为它没有返回线性增加的时间戳数。 NTP等用户可以随时更改系统时钟,时间会前后跳跃。

4 个答案:

答案 0 :(得分:3)

您可能希望查看可用的各种clock synchronization算法。显然,Precision Time Protocol可以让您在局域网上达到亚微秒以内的准确度。

如果您不需要特定的时间值,而是想知道各种事件的顺序,您可以使用Lamport timestamps

答案 1 :(得分:0)

这是一个处理器&操作系统依赖Q.例如,查看POSIX时钟,有高精度时间感知时间戳(例如CLOCK_REALTIME返回纳米纪元时间值)和高精度任意时间时间戳(例如CLOCK_MONOTONIC)(注意:这两者之间的差异是在this answer中很好地解释了。

后者通常类似于时间,因为盒子被启动,因此除非你在第一个时间内具有高精度时钟同步(例如,在另一个答案中引用的PTP),否则无法在服务器之间准确地比较它们地方(因为那时你可以分享它们之间的偏移)。

NTP是否足够好取决于您尝试衡量的内容。例如,如果您尝试测量几百微秒的间隔(例如连接到同一个开关的盒子),那么您的结果将是粗糙的,另一方面,如果您的服务器位于不同的地理位置,NTP可能非常好完全位置(例如伦敦到纽约),这意味着时钟同步效果(只要它不会离开)会被位置之间的延迟所淹没。

FWIW从java访问这些时钟所需的JNI非常简单。

答案 2 :(得分:0)

您不能在两台不同的计算机之间使用nanoTime。对于Java API docs

  

此方法只能用于测量经过的时间而不是   与系统或挂钟时间的任何其他概念有关。价值   返回表示自固定但任意时间以来的纳秒   (也许在将来,所以价值可能是负面的。)

无法保证nanoTime与任何时基相关。

答案 3 :(得分:0)

您可以将时间与当前时间毫秒同步。但是,即使您使用NTP,机器之间也会漂移1 ms到10 ms。在机器之间进行微秒同步的唯一方法是使用专业硬件。

nanoTime保证在两个不同的操作系统上以相同的方式确定或具有相同的分辨率。