2017-04-17 341 views
1

我的目标是将时间戳存储在纳秒范围内。假设我有两台需要进行通信的机器,在任务完成的时间。以纳秒为单位存储时间戳C++

让我们对这个问题的目的只是,说自己一个同步的时钟。
机器A存储当地时间。机器B发送给A,在此时完成。机器A然后计算差异。

我的问题是,是,为TimeDifference实际上可以达到60秒,但也下降到.25ms。所以我需要以这样的方式存储时间,以便我可以处理这两种情况,并计算时间差异。

由于时间纪元以来纳秒是这么大的数字,我不认为我可以存储在我所知道的任何变量。

你将如何解决这种情况?我目前的情况是,我可能(以某种方式)可以将时间从ns开始缩短到代表1分钟的时间,尽管我不知道该怎么做。

希望你能帮上忙。

问候

回答

3

只需使用一个64位整数,有符号(int64_t)或无符号(uint64_t),你会是所有罚款。

64位的空间实在是巨大的。这不仅足以存储时间差异,而且存储绝对时间值,这通常是从1970-01-01午夜开始计算的。

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

1492432621.123456789 

在纳米秒,这就是:

1492432621123456789 

为了比较,最大的签署64位整数值是:

9223372036854775807 

这大致对应于2262-04-12,这个日期几乎是你几乎肯定不会再活着了。但是,如果您仍然担心软件运行超过两个世纪的可能性,在此期间不会改进,并且最终会崩溃,那么您应该使用未签名的 64位整数,这会给它更多的世纪,或者你应该使用128位整数,这些整数几乎肯定是安全的,直到宇宙死亡。需要注意的是128位的整数are supported所有现代64位架构(__int128unsigned __int128),所以你可以放心地使用它们,除非,当然,你需要支持旧的32位系统。或者16位系统。 8位,任何人?

+0

稍微超过584年适合内部精度为毫微秒的无符号64位整数。所以是的,我认为OP会很好。 – rwols

+0

我期待这款软件在245年内死于Y2K262问题(是的,我们仍然会使用K,即使它实际上并没有缩短字符串的长度)。 :-) – ShadowRanger

+0

我的猜测是我的软件不会持续到宇宙的尽头。我要买它!谢谢! –

1

我建议使用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上,以1/10的microseconds单位system_clock::now()报道:

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

相关问题