chrono 是一个 time library , 源于 boost ,现在已经是 C++ 标准,计时精度可以达到微秒级。

Example

#include <iostream>
#include <chrono>

int main()
{
    auto begin = std::chrono::system_clock::now();
    // do something
    auto end = std::chrono::system_clock::now();
    auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - begin);
    const double res = double(duration.count()) * 
        std::chrono::microseconds::period::num / std::chrono::microseconds::period::den;
    std::cout << "Took " << res << "seconds" << std::endl;
    return 0;
}

Explain

durations

std::chrono::duration 表示一段时间。可以是 1 分钟,半个时辰, 6 秒等等,只要可以换算成秒即可。

template <class Rep, class Period = ratio<1> > class duration;
  • Rep 是一种数据类型,用来表示 Period 的数量。如 int,double 等。
  • Period 是 ratio 类型的数,用来表示 一段时间换算成秒 是多少。

ratio 模板的原型:

template <intmax_t N, intmax_t D = 1> class ratio;

N代表分子,D代表分母,所以ratio表示一个分数值。

常用的 duration 已经定义好了,在 std::chrono::duration 里面:

durationexplain
ratio<3600, 1>hours
ratio<60, 1>minutes
ratio<1, 1>seconds
ratio<1, 1000>milliseconds
ratio<1, 1000000>microseconds
ratio<1, 1000000000>nanoseconds

由于各种duration表示不同,chrono库提供了duration_cast类型转换函数:

template <class ToDuration, class Rep, class Period>
   constexpr ToDuration duration_cast (const duration<Rep,Period>& dtn);

同时 duration 还有一个成员函数 count() ,其返回值是 Rep 类型的 Period 数量。简单来说就是返回时间。

Time points

std::chrono::time_point 表示任意一个具体的时间点,只要这个时间点可以用计算机时钟表示。而 time_point 的精度则取决于我们使用的单位,可以是某一天,某一分钟,某一秒等。一个 time_point 必须有一个 clock 计时。函数原型如下:

template <class Clock, class Duration = typename Clock::duration>  class time_point;

time_point 有一个函数 time_from_eproch() 用来获得 197 0年 1 月 1 日到 time_point 时间经过的 duration 。duration 的单位和 time_point 相同。

由于各种 time_point 表示方式不同,chrono 也提供了相应的转换函数 time_point_cast :

template <class ToDuration, class Clock, class Duration>
  time_point<Clock,ToDuration> time_point_cast (const time_point<Clock,Duration>& tp);

clocks

std::chrono::system_clock 它表示当前的系统时钟,系统中运行的所有进程使用 now() 得到的时间是一致的。

每一个clock类中都有确定的time_point, duration, Rep, Period类型。

操作有:

  • now() 当前时间 time_point
  • to_time_t() time_point 转换成 time_t 秒
  • from_time_t() 从 time_t 转换成 time_point

Referrer

https://www.cnblogs.com/jwk000/p/3560086.html

https://blog.csdn.net/u013390476/article/details/50209603

最后修改:2020 年 04 月 10 日
如果觉得我的文章对你有用,请随意赞赏