【问题标题】:How can I get a high resolution time stamp as a double?如何获得高分辨率时间戳作为双精度?
【发布时间】:2016-01-14 02:53:33
【问题描述】:

我正在尝试使用以下代码:

std::chrono::high_resolution_clock::now();

获取时间戳,但我需要它作为双精度,但它不是支持数据类型,自动工作,但我无法操作它。

【问题讨论】:

  • 为什么需要它作为替身?你的时间单位是多少?
  • 一般来说,使用毫秒等整数单位可能比使用双精度数更准确。

标签: c++ timestamp chrono


【解决方案1】:

您的“时间戳”是<chrono> 库所称的time_pointtime_point 是时钟和持续时间的集合。持续时间是表示和周期的集合。

您指定了这三个中的两个:

  • clock == high_resolution_clock
  • representation == double
  • period == ?

您的周期可以是nano (ratio<1, 1000000000>)、milli (ratio<1, 1000>)、seconds (ratio<1>)、minutes (ratio<60>) 或任何其他与秒的合理关系。

例如,假设您想要一个时间戳,使用双精度表示,秒作为周期。这看起来像这样:

using clock = std::chrono::high_resolution_clock;
using dsec = std::chrono::duration<double>;
using tps = std::chrono::time_point<clock, dsec>;
tps tp = clock::now();

high_resolution_clock::now() 发出的time_point 将使用双精度表示和一个比率周期 隐式转换为您的time_point。自high_resolution_clock 的纪元以来,它将保持小数秒。

一般来说,因为您的目标类型具有浮点表示,所有 time_point 源类型都会隐式转换为它。要反向转换,您需要使用std::chrono::time_point_cast&lt;some-duration&gt;(source-time_point)

如果您想保留双基纳秒,则如下所示:

using clock = std::chrono::high_resolution_clock;
using dns = std::chrono::duration<double, std::nano>;
using tpns = std::chrono::time_point<clock, dns>;
tpns tp = clock::now();

作为指导,我建议使用system_clocksteady_clock,但不要使用high_resolution_clock。如果您的time_point 需要与民用日历有某种关系,或者需要跨流程保持意义,请使用system_clock。如果您的 time_point 仅在同一进程内的短时间内使用,请使用 steady_clock

high_resolution_clock(事实上)始终是system_clocksteady_clock 的别名。所以你不妨使用后者之一,并知道你得到了什么。

using clock = std::chrono::system_clock;
using dsec = std::chrono::duration<double>;
using tps = std::chrono::time_point<clock, dsec>;
tps tp = clock::now();

【讨论】:

  • 很好的答案,对 c++ 时钟类有很好的洞察力!我可以将该行附加到您的答案中的第一个示例以获得实际的双 UTC 时间戳:double ts = tp.time_to_epoch().count();
  • 我宁愿你不这样做。理由:.count()(以及就此而言.time_to_epoch())通常被这个库的新手过度使用。初学者将调用now()立即 摆脱chrono 库的类型安全。我一直在进行长达十年的运动来阻止这种情况。我宁愿直接回答有关如何获取double 的问题,这样我就可以了解为什么需要它。一旦知道“为什么”,.count() 的答案很有可能是错误的。
【解决方案2】:

std::chrono::high_resolution_clock::now() 返回一个std::time_point&lt;std::chrono::high_resolution_clock&gt;。在这里,您可以选择是否要以纳秒、微秒、毫秒等表示这个时间点,使用std::chrono::duration,并最终将其转换为double

std::chrono::time_point<std::chrono::high_resolution_clock> tp = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::micro> dur = tp;
double micros = dur.count();

在这里,您可以将std::micro 替换为您想要的任何分辨率。

【讨论】:

    猜你喜欢
    • 2012-12-21
    • 1970-01-01
    • 2015-01-17
    • 2017-12-21
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 2013-06-14
    • 2016-08-17
    相关资源
    最近更新 更多