C++11如何打印出高分辨率时钟时间点



从high_resolution_clock获取时间点时,如何打印时间点?

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);

没有真正优雅的方法可以做到这一点。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 epochn";
}

对我来说输出:

516583779589531 [1/1000000000] units since epoch

这意味着从我的机器上的这个时钟的历元开始,它是516583779589531纳秒(或516583.779589531秒)。在我的机器上,这意味着:我的机器已经启动了近6天。但这种翻译是不可移植的。

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

至少在我读东西的时候,目的是std::high_resolution_clock可以被定义为CPU时间戳计数器的包装器,它只是一个寄存器,每个CPU时钟周期递增。

事实并非如此(当前系统不断修改CPU时钟频率可能是个糟糕的主意),但也支持其他类似的时钟。

一句话:绝对时间和高分辨率时钟之间可能没有已知的关系,所以它实际上只被定义为产生持续时间,而不是绝对时间。

本文提供了从任何时钟时间点到time_t的转换。

最新更新