2

将 java 虚拟机与 System.nanoTime () 同步是否有意义?

我是说 :

  • 调用 System.nanoTime() 并将结果放入 t1
  • A向B发送数据包
  • 当 B 收到来自 A 的数据包时,B 调用 System.nanoTime() 并将结果发送给 A
  • 当 A 收到来自 B 的数据包时,A 调用 System.nanoTime() 并将结果放入 t3,将收到的来自 B 的数据包中的时间放入 t2
  • 时移 = (t3 - t1) / 2 - t2

使用 System.nanoTime 这样做是否正确?

谢谢 !

4

3 回答 3

8

使用 System.nanoTime 这样做是否正确?

No.System.nanoTime()仅用于测量单个 JVM 内的时间差异,而不是跨多个 JVM 的绝对时间。

此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。返回的值表示自某个固定但任意的原始时间以来的纳秒(可能在将来,因此值可能为负数)。在 Java 虚拟机实例中,此方法的所有调用都使用相同的来源;其他虚拟机实例可能使用不同的来源。

为了解决这个问题,通常你会使用System.currentTimeMillis(),但这仍然受到两台计算机的操作系统时钟的限制。使用 NTP 跨计算机同步时间。

请参阅使用 Java 在服务器和 Internet 之间进行时间同步

于 2011-10-13T11:09:10.300 回答
1

System.nanoTime() 相对于一个任意且未指定的时间点。据我观察,这似乎来自计算机的正常运行时间。

这使得在两台机器上比较 nanoTime 变得非常困难。

timeshift = (t3 + t1) / 2 - t2; // note the + instead of -

您使用的公式可用于估算两台机器之间的差异,但它可能显示出巨大的差异。解决这个问题的一种方法是执行 1000 次并取平均值或中位数,这在过去给了我一个稳定的结果。

这个数字需要定期更新,因为即使是温度也会加快或减慢纳米计时器。

注意:将两台机器可靠地保持在一毫秒内是非常困难的。;)

于 2011-10-13T11:14:28.313 回答
0

目前尚不完全清楚您要达到的目标。

如果您尝试同步时钟,则有专门的协议,例如NTPnanoTime()在任何情况下都没有用,因为它的值在 JVM 之间没有可比性。

如果您尝试测量延迟,请重复测量往返 ( t3-t1) 并除以 2。为此,nanoTime()确实可以使用。

于 2011-10-13T11:09:30.847 回答