5

比较在两台不同机器上调用 System.nanoTime() 产生的两个值是否正确?我会说不,因为 System.nanoTime() 通过使用依赖于处理器的时间戳计数器 (TSC)返回相对于某个任意点时间的纳秒精度时间。

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

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

4

4 回答 4

4

您可能想研究各种可用的时钟同步算法。显然,精确时间协议可以让您在 LAN 上达到亚微秒级的精度。

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

于 2011-11-03T20:06:34.640 回答
1

您不能nanoTime在两台不同的机器之间使用。对于Java API 文档

此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。返回的值表示自某个固定但任意时间以来的纳秒(可能在将来,因此值可能为负数)。

不能保证nanoTime与任何时基相关。

于 2011-11-03T20:28:19.950 回答
0

这是一个依赖于处理器和操作系统的问题。例如,查看 POSIX 时钟,有高精度的时间感知时间戳(例如 CLOCK_REALTIME 返回纳米纪元时间值)和高精度的任意时间时间戳(例如 CLOCK_MONOTONIC)(注意:这两个之间的区别在这个答案中得到了很好的解释)。

后者通常是自机器启动以来的时间,因此除非您首先具有高精度的时钟同步(例如,在另一个答案中引用的 PTP),否则无法在服务器之间准确比较它们(然后您会能够在它们之间共享偏移量)。

NTP 是否适合您取决于您​​要测量的内容。例如,如果您尝试测量几百微秒的间隔(例如连接到同一个交换机的盒子),那么您的结果将是粗略的,在另一个极端情况下,如果您的服务器完全位于不同的地理位置,NTP 可能会非常好(例如伦敦到纽约)这意味着时钟同步效果(只要它不是很远)被位置之间的延迟所淹没。

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

于 2011-11-03T20:16:41.223 回答
0

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

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

于 2011-11-03T22:45:00.710 回答