【问题标题】:Reliably compare different machine's timestamps in C++在 C++ 中可靠地比较不同机器的时间戳
【发布时间】:2017-04-07 21:38:54
【问题描述】:

我有三台机器A, B, C 通过以太网连接。 A 会将 UDP 数据包发送到 BB 会将其转发到 C。我想可靠地测量传播时间。假设这三台机器使用本地 NTP server 进行时间同步。

C++ 中生成时间戳的最佳方法是什么?我目前的猜测是chrono。我理解它的方式是它的high_resolution_clock 在这里是不可能的,因为它可以使用像每次操作都会递增的 CPU 寄存器之类的东西。所以这会根据机器启动的时间而有很大的不同。相反,我将使用steady_clock,它将使用同步的系统时间,但希望能防止我遇到像闰秒这样的问题,如果我使用system_clock,这很重要。

我的这些假设是否正确?有更好的方法吗?

【问题讨论】:

  • 您的目标是哪个操作系统/工具链?
  • Linux(一些 Ubuntu 变体),使用 boost::asio 发送内容。每当发送某些内容时,源都会记住它发送该数据包的时间戳。接收器将记住到达的时间戳。两者都会定期对这些数据进行 ping。
  • 忽略闰秒。如果您检测到在测量期间或周围发生了闰秒,请放弃该测量。处理最多每六个月发生一次的事件比特殊情况要容易得多。
  • 很公平。 :)

标签: c++ c++11 timestamp


【解决方案1】:

稳定的时钟对您没有任何帮助,因为它不是挂钟,并且根据定义它可以不同步(它是稳定的,NTP 无法更改它)。所以你唯一的选择是挂钟/系统时钟。

但是,您的问题之一是通过 NTP 进行的时间同步不是很准确。如果您想比较以秒为单位的时间戳,那可能没问题。对于其他所有事情,您的时钟通常会偏离得太远而无法提供良好的结果。

有用于在不同机器之间同步时钟的专用协议,例如PTP 和 gPTP。其中一些甚至需要专用硬件(如支持以太网 AVB 的硬件)。如果您需要精确,那么您的第一个研究应该是如何将这些集成到您的系统中以及如何读取它们的时间戳。

【讨论】:

  • 关于 PTP 的要点。 NTP 对时间精度的保证非常广泛,如果您想对本地网络上的数据包进行计时,则不是很有用。
  • 此链接 (eecis.udel.edu/~mills/ntp/html/discipline.html) 指出,在快速 LAN 上,NTP 可以“名义上在一毫秒内保持同步”。这对我来说很好,而且比秒更精确......
  • 您的问题是提到测量数据包延迟。在 LAN 上,UDP 数据包的延迟将在微秒范围内。所以我猜你需要高精度,这些协议就是为了实现这一点而开发的。
  • 而且通常不仅平均时差会很有趣,而且时钟相对于彼此的漂移量也会很有趣。某些方法会产生比其他方法高得多的时钟抖动,这将对某些类型的实时应用产生很大影响。但我当然不知道这对你的具体问题是否重要。
  • @kunterbunt 这个问题已经得到了很好的回答,使用system_clock,但答案对你没有多大好处。您还有两个其他问题: 1 能够检测传播延迟的高精度时间,其中传播延迟可能为微秒。这是 PC 硬件上的一个难题,因为当您低于 ms 时,分辨率时间变得越来越狡猾。 2. 同步多台 PC 并精确锁定它们以支持问题 1。
【解决方案2】:
  1. high_resolution_clock 几乎总是(如果不是总是)steady_clocksystem_clock,因此它可能是通用的挂钟时间或特定于机器的计数器。你真的不知道你会得到哪个。值得一读的讨论:https://stackoverflow.com/a/38253266/4581301

  2. steady_clock is not the clock for you. 不同机器上的steady_clocks 之间没有保证的相关性。

这会给您留下system_clock 或特定于实现的时钟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 2019-03-21
    • 2012-07-09
    相关资源
    最近更新 更多