可靠地比较不同机器的时间戳C++

Reliably compare different machine's timestamps in C++

本文关键字:机器 时间戳 C++ 比较      更新时间:2023-10-16

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

C++中生成时间戳的最佳方法是什么?我目前的猜测是chrono。我理解的方式是,它的high_resolution_clock不在这里的问题,因为它可以使用每个操作上会增加的CPU寄存器之类的东西。因此,这会因机器启动何时而异。相反,我将使用steady_clock,它将使用同步系统时间,但希望我会阻止我遇到诸如leap seconds之类的问题,如果我使用system_clock,这很重要。

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

稳定时钟根本不会帮助您,因为它不是壁时钟,并且从定义上可以同步(稳定,NTP无法更改)。因此,您唯一的选择是壁时钟/系统时钟。

您的问题之一是,通过NTP同步的时间不是很精确。如果您想在几秒钟的尺寸中比较时间戳,则可能还可以。对于其他所有时钟,您的时钟通常都太远了,无法取得良好的效果。

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

  1. high_resolution_clock几乎总是(如果不是总是)steady_clocksystem_clock,因此它可能是通用墙时或机器特定的计数器。您真的不知道会得到哪个。值得阅读的讨论:https://stackoverflow.com/a/38253266/4581301

  2. steady_clock不是您的时钟。在不同机器上steady_clock s之间没有保证的相关性。

这使您拥有system_clock或特定于实现的时钟。