Ben*_*sen 3 c++ time c++11 c++-chrono
我的目标是将时间戳存储在纳秒范围内.假设我有两台机器需要在任务完成的时间进行通信.
让我们只是为了问题,说他们是同步时钟.
机器A在完成后存储当地时间.机器B发送到A,此时它完成.机器A然后计算差异.
我的问题是,时差实际上可以达到60秒,但也可以降到.25ms.所以我需要以这样的方式存储时间,我可以处理两者,并计算时差.
由于纳秒时代以来的时间是如此之大,我认为我不能将其存储在我所知道的任何变量中.
你会如何解决这种情况?我当前的情况是,我可能(某种程度上)可以缩短从ns开始的时间到代表1分钟的时间,但我不知道该怎么做.
希望你能帮忙.
最好的祝福
只需使用64位整数,signed(int64_t)或unsigned(uint64_t),你就可以了.
64位空间真的很大.它不仅足以存储时间差异,甚至可以存储绝对时间值,通常以1970-01-01午夜以来的时间来衡量.
例如,现在1970-01-01以来的秒数大致为:
1492432621.123456789
Run Code Online (Sandbox Code Playgroud)
在纳秒内,这是:
1492432621123456789
Run Code Online (Sandbox Code Playgroud)
为了比较,最大的带符号64位整数值是:
9223372036854775807
Run Code Online (Sandbox Code Playgroud)
这大致相当于2262-04-12,这个日期你几乎肯定不会再活着了.
但是,如果您仍然担心软件运行超过两个世纪的可能性,在此期间不会得到改进,并且最终会崩溃,那么您应该使用无符号的 64位整数,这会给它一些更多世纪,或者你应该使用128位整数,这几乎肯定是安全的,直到宇宙死亡.请注意,所有现代64位体系结构(或)都支持 128位整数,因此您可以安全地使用它们,当然,除非您需要支持传统的32位系统.或16位系统.8位,有人吗?__int128unsigned __int128
我建议使用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();
Run Code Online (Sandbox Code Playgroud)
这使您获得与当前接受的答案 ( int64_t) 相同的范围,但增加了类型安全。Anint64_t可能表示时间点或持续时间。 sys_nanoseconds只能表示 a time_point,如果像持续时间一样使用,将导致编译时错误。
例如,将两个相加是一个编译时错误sys_nanoseconds。但你可以减去二sys_nanoseconds,得到的类型是std::chrono::nanoseconds。
您的范围(上溢/下溢之前)将是:
1677-09-21 00:12:43.145224192 to 2262-04-11 23:47:16.854775807
Run Code Online (Sandbox Code Playgroud)
要以纳秒精度获得更大范围的价值值得怀疑,但可以在支持 128 位类型的平台上这样做:
using nano128 = std::chrono::duration<__int128_t, std::nano>;
using sys_nano = sys_time<nano128>;
Run Code Online (Sandbox Code Playgroud)
现在你的范围远远大于+/-宇宙年龄。
请注意,在某些平台上,std::chrono::system_clock::now()不会以纳秒的精度进行报告。因此,存储纳秒时间戳可能有点矫枉过正。然而,将上面的代码更改为您想要的任何单位是很简单的。
system_clock::now()据报道,在 macOS 上microseconds,其范围将是nanoseconds. 在 Windows 上system_clock::now()以 a 的 1/10 为单位进行报告microseconds:
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>;
Run Code Online (Sandbox Code Playgroud)
关于海湾合作委员会的system_clock::now()报告nanoseconds。
| 归档时间: |
|
| 查看次数: |
4329 次 |
| 最近记录: |