【问题标题】:C++11 how to print out high resolution clock time_pointC++11如何打印出高分辨率时钟time_point
【发布时间】:2014-09-30 18:53:35
【问题描述】:

从high_resolution_clock获取time_point时如何打印出time_point?

timestamp = std::chrono::high_resolution_clock::now();
std::time_t now = std::chrono::system_clock::to_time_t(timestamp);
std::cout << std::ctime(&now) << std::endl;

我在编译时收到以下错误消息:

error: no viable conversion from 'time_point<class std::__1::chrono::steady_clock, duration<[...], ratio<[...], 1000000000>>>' to 'const time_point<class std::__1::chrono::system_clock, duration<[...], ratio<[...], 1000000>>>'
        time_t tt = std::chrono::system_clock::to_time_t(timestamp);

【问题讨论】:

  • 您可能会解析到经过的持续时间:duration_cast&lt;duration&lt;double&gt;&gt;(stop - start).count()

标签: c++ c++11 chrono


【解决方案1】:

没有真正优雅的方法可以做到这一点。 high_resolution_clock 不知道与 UTC 或任何其他日历相关。您可以便携地做的一件事是从其未指定的时期输出其当前持续时间,以及该持续时间的单位:

#include <chrono>
#include <iostream>

int
main()
{
    using Clock = std::chrono::high_resolution_clock;
    constexpr auto num = Clock::period::num;
    constexpr auto den = Clock::period::den;
    std::cout << Clock::now().time_since_epoch().count()
              << " [" << num << '/' << den << "] units since epoch\n";
}

对我来说输出:

516583779589531 [1/1000000000] units since epoch

这意味着它是 516583779589531 纳秒(或 516,583.779589531 秒),因为我的机器上的这个时钟的时代。在我的机器上,这意味着:我的机器已经启动了将近 6 天。但这种翻译是不可移植的。

啊!我从您的错误消息中注意到您正在使用libc++。如果您也在 OS X 上,那么我们对 high_resolution_clock 的定义相同:它计算自您的计算机启动以来的纳秒。

【讨论】:

  • 感谢您的解释 - 尽管错误消息是 libc++,但代码需要独立于平台(至少对于 OSX、Windows、Linux 而言),所以我一直希望能轻松获胜。 high_resolution_clock 和系统时间之间没有联系似乎很奇怪,哦,好吧。我现在已经使用 system_clock 实现了。
【解决方案2】:

至少在我阅读内容时,其意图是 std::high_resolution_clock 可以定义为 CPU 时间戳计数器之类的包装器,它只是一个在每个 CPU 时钟周期递增的寄存器。

情况不一定如此(在当前系统不断修改 CPU 时钟频率的情况下,这可能是个坏主意),但也打算支持其他类似的时钟。

底线:绝对时间和高分辨率时钟之间可能没有已知的关系,因此它实际上只定义为产生持续时间,而不是绝对时间。

【讨论】:

    【解决方案3】:

    this post 提供从任意时钟时间点到 time_t 的转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多