【问题标题】:How to get nanoseconds from boost::chrono::hight_resolution_clock::time_point?如何从 boost::chrono::hight_resolution_clock::time_point 获得纳秒?
【发布时间】:2016-08-03 18:04:33
【问题描述】:

我是 boost 和 chrono 的新手。我正在编写一个记录 API 调用、进入和退出时间戳的记录器。我首先尝试使用 boost::xtime,但它没有提供我需要的高分辨率值。因此正在考虑使用 Chrono。我声明了一个 boost::chrono::hight_resolution_clock::time_stamp x;用于获取时间戳并将其分配给 boost::chrono::hight_resolution_clock::now (); 的变量。现在,我需要从这个变量中获取纳秒并将其放入我的日志文件中(这是要求)。所以我将它转换为 boost::chrono::duration_cast (x)。但它就是不允许我这样做。它显然需要 2 个参数,而我只有一个。有没有办法解决这个问题?是否可以创建另一个 time_stamp 变量并将其分配为零并使用该变量?我尝试分配零,但它不起作用。请帮帮我。

谢谢, 山姆

【问题讨论】:

  • 你的目标系统真的能够纳秒定时器分辨率吗?
  • 你想要几纳秒?您想要自最后一整秒以来的纳秒(高分辨率时间戳),还是想要自纪元以来的纳秒,还是什么?
  • 是的,我的目标系统能够达到纳秒级的分辨率。我需要以纳秒为单位的当前时间(高分辨率时间戳)。

标签: c++ c++11 boost chrono


【解决方案1】:

如果标记为c++11,有什么理由不使用std::chrono

// Using std::chrono
auto start = std::chrono::high_resolution_clock::now();  // start timer

/* do some work */

auto diff = std::chrono::high_resolution_clock::now() - start; // get difference 
auto nsec = std::chrono::duration_cast<std::chrono::nanoseconds>(diff);
std::cout << "it took: " << nsec.count() << " nanoseconds" << std::endl;

【讨论】:

  • 嗨 Remis,这不是以纳秒为单位获取增量时间的解决方案吗?是否有可能以纳秒为单位获取当前时间?请指教
  • “当前时间以纳秒为单位”是什么意思?时间点被定义为一个纪元之后的持续时间,它由时钟定义。例如 1970-01-01 是 UNIX 系统的时代。因此,“当前时间”类似于一个纪元以来的 1,470,252,780,000,000,000 纳秒。
  • 在 C++ 标准库中的第 5.7. Clocks and Timers 章中查找更多信息,The: A Tutorial and Reference。
【解决方案2】:

boost::chrono::duration_cast 将持续时间转换为指定单位,但您给它的是boost::chrono::time_point,而不是持续时间。

真的没有“当前时间以纳秒为单位”这样的东西。要获得持续时间,您需要指定您想知道已经过去多少纳秒的时间(“纪元”)。不同的时钟会根据不同的纪元测量时间。

boost::chrono::system_clock(当前)使用 Unix 纪元(1970 年 1 月 1 日午夜)作为纪元,但它不稳定并且可能没有您需要的分辨率(在我的 Ubuntu 机器上以纳秒为单位,但在 1/在我的 Windows 机器上是 10,000,000 分之一秒)。

boost::chrono::high_resolution_clock 使用启动作为它的时代,是稳定的,并且在我测试的两个盒子上测量时间(以纳秒为单位)。

Boost 还提供了其他时钟,例如 process_cpu_clock,它们使用其他时期并以其他单位计数。

因此,您可以使用system_clock 获得自 1970 年 1 月 1 日以来的 nanos,但它实际上可能不是纳秒精度的,如果用户更改系统时间或计算机与网络时间同步,或者您可以使用 high_resolution_clock 从其他时间点获得 nanos。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 2018-03-12
    • 2023-04-07
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    相关资源
    最近更新 更多