将时间戳存储在纳秒C 中

Store timestamps in nanoseconds c++

本文关键字:时间戳 存储      更新时间:2023-10-16

我的目标是将时间戳存储在纳秒范围内。假设我有两台需要进行交流的机器,正是在什么时候完成任务。

让我们只是为了这个问题,说它们是同步的时钟。
机器A完成后将其当地时间存储。机器B将其传输到A,此时完成。机器A然后计算差异。

我的问题是,定时差实际上可以长达60秒,但也可以降至.25ms。因此,我需要以这样的方式存储时间,以便我可以处理两者并计算定时差。

自从纳米秒时的时代以来,这是一个很大的数字,我认为我无法将其存储在我所知道的任何变量中。

您将如何解决这种情况?我目前的目前是,我可能(某种程度上(可以扩展自NS中的时代以来,但我不知道该怎么做。

希望您能提供帮助。

最好的问候

只需使用64位整数,签名(int64_t(或unsigned( uint64_t(,您都可以很好。

64位的空间真的很大。它不仅足以存储时间差,而且还足以存储绝对时间值,通常将其作为自1970-01-01午夜以来的时间测量。

例如,现在自1970-01-01以来的秒数大致是:

1492432621.123456789

在纳米秒中,这是:

1492432621123456789

为了进行比较,最大的签名的64位整数值为:

9223372036854775807

这大约对应于2262-04-12,您几乎可以肯定不会再活着的日期。

但是,如果您仍然关心您的软件运行超过两个世纪的可能性,在此期间不会改善,最终将崩溃,那么您应该使用 unsigned 64位整数将为它提供更多的世纪,或者您应该使用128位整数,这些整数几乎可以肯定是安全的,直到宇宙去世为止。请注意,所有现代64位体系结构(__int128unsigned __int128(都支持128位整数,因此您可以安全地使用它们,除非您当然需要支持Legacy 32位系统。或16位系统。8位,有人吗?

我建议使用 std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>。您可以通过类型的别名使它变得更漂亮。例如:

template <class Duration>
    using sys_time = std::chrono::time_point<std::chrono::system_clock, Duration>;
using sys_nanoseconds = sys_time<std::chrono::nanoseconds>;
sys_nanoseconds now = std::chrono::system_clock::now();

这使您与当前接受的答案(int64_t(相同,但添加了类型安全。int64_t可能意味着时间点或时间持续时间。sys_nanoseconds只能表示time_point,如果使用时间持续时间,则会导致编译时间错误。

例如,将两个sys_nanoseconds添加在一起是一个编译时错误。但是您可以减去两个sys_nanoseconds,结果类型为std::chrono::nanoseconds

您的范围(在溢出/下流之前(将是:

1677-09-21 00:12:43.145224192 to 2262-04-11 23:47:16.854775807

以纳秒精度获得更大的范围是可疑的,但是可以在支持128位类型的平台上这样完成:

using nano128 = std::chrono::duration<__int128_t, std::nano>;
using sys_nano = sys_time<nano128>;

现在您的范围远大于/-宇宙年龄。

请注意,在某些平台上,std::chrono::system_clock::now()不会准确地报告纳秒。因此,存储纳秒时间戳可能过高。但是,使用上述代码并将其更改为您想要的任何单位是微不足道的。

在MacOS上,system_clock::now()报告microseconds,其范围为nanoseconds的1000倍。在Windows system_clock::now()上,microseconds的1/10单位报告:

using win_sys_duration = std::chrono::duration<std::int64_t,
                                               std::ratio<1, 10'000'000>>;
using win_sys_time_point = sys_time<win_sys_duration>;

和在GCC上,system_clock::now()报告nanoseconds