std::chrono库的使用

std::chrono学习笔记

chrono是一个模版库,提供关于日期和时间的一些功能。
先举个例子,如果我想知道看这篇博文花了多长时间:
(1)首先需要有一个能提供时钟(clock)的设备(电脑、手机、手表、挂钟等)
(2)记录开始阅读和结束阅读的时间点(time_point);
(3)计算两次的时间之差就是阅读持续时间(duration)。
chrono的模板库常用的3个模板也是这3个:duration、time_point、clock
在使用时,需要引用chrono头文件。

#include <chrono>

clock

既然谈到时间,总需要找一个时钟作为参照吧,就像我们想知道当前时间,可以看墙上的挂钟,可以看手表,可以看手机。clock就是这个时钟,在计算机中一般都会有一套或多套时钟系统供程序使用。
在std::chrono库中,有3种时钟:

  • system_clock
  • steady_clock
  • hight_definition_clock
    一般情况下,他们3个没有太大的区别,hight_definition_clock、steady_clock仅仅是system_clock的typedef,但是有为什么要区分呢,因为在有些情况下,他们是存在差异的。

情况1:system_clock和steady_clock的差异
比如windows系统可以提供时钟,如果认为时间不准,我们还可以进行调整。在没有调整时间前,system_clock和steady_clck是一样的,他们的读数都是单调匀速增加的;但是如果调整时间后,它们两者的读数就会出现差异,system_clock的读数就会出现跳变,而steady_clock依然保持线性单调递增,不受clock调整的影响,这个特点非常方便我们统计时间耗时(duration)。
情况2:system_clock与hight_definition_clock的差异
如果系统提供的时钟(clock)不止一种,有的时钟精度高(分辨率),有的精度低,hight_definition_clock使用时精度最高的clock,但是system_clock就不一定了。

clock主要用于获取当前的时间,通过now()获取,方法如下。关于time_point在下面讲解。

std::chrono::system_clock::time_point current_time = std::chrono::system_clock::now();

time_point

time_point是具体的时间,比如某年某月某日几点几分几秒,time_point依赖于clock的计时。
通过上文中的方法可以将当前时间赋值给current_time,current_time的时间数据是一个数字,表示当前时间是经过了多少个计时单位了,那么计时的起点是什么时候呢?为了让不同地区、不同国家、不同的设备有一个统一标准,可以通过time_since_epoch().count()计算以 1970 年 1 月 1 日 00:00 UTC 为起点的时间。

std::chrono::system_clock::time_point current_time = std::chrono::system_clock::now();
cout << "current_time = " << current_time.time_since_epoch().count() << endl;

duration

duration表示一段时间,也就是持续时间,是一个时间的长度,比如1个小时、35秒、33毫秒。
它的模板类如下,包含两个参数,Rep是必需要指定的,Period是可选择输入的,简单的说Rep表示数据的类型,如int、float等;Period可以理解为时间的单位,默认是1秒,自己也可自定义修改,就是duration每增加1与之对应的时间是多少。

template <class Rep, class Period = ratio<1> > class duration;
  • 使用默认1秒作为计量单位
typedef std::chrono::duration<int> t_int;
typedef std::chrono::duration<double> t_float;
// duration每增加1,表示的时间的变化量为1秒
  • 使用自定义的值作为计量单位
// duration每增加1,时间的变化为0.001秒
typedef std::chrono::duration<float, std::ratio<1,1000>> mSec_float; // 1/1000秒作为计量单位,也就毫秒
// duration每增加1,时间的变化为60秒
typedef std::chrono::duration<int, ratio<60, 1>> minute_int; // 60/1秒为计量电位,也就是1分钟

上面ratio有两个参数ratio<num, den>,那么实际的单位为num/den秒。

除了可以通过ratio来自定义时间的计量单位,也可以使用std库中预定义好的变量,本质上也是使用ratio定义好的。
在这里插入图片描述
使用方法如下

std::chrono::duration<int, std::milli>  // 毫秒
std::chrono::duration<int, std::micro>  // 微秒
std::chrono::duration<int, std::nano>   // 纳秒
  • 如何定义、修改duration的变量
#include <chrono>
#include <iostream>
using namespace std;
int main(int argc, int** argv[]) {
    typedef std::chrono::duration<int, std::milli> mSec_t;
    mSec_t t1(2000);
    cout << "t1 = " << t1.count() << endl;
    // t1 = 3000; // 不能这样赋值
    t1 = mSec_t(3000); // 修改变量
    cout << "t1 = " << t1.count() << endl;

    system("pause");
    return 0;
}

一个例子

通过获取两个时刻的时间,然后计算时间长度。

#include <chrono>
#include <iostream>
#include <thread>
#include <ctime>

using namespace std;

int main() {
   // DEMO:通过获取两个时刻的时间,然后计算时间长度

    using namespace std::chrono;

    // Step one: 定义一个clock
    typedef system_clock sys_clk_t;

    // Step two: 分别获取两个时刻的时间
    typedef system_clock::time_point time_point_t;
    // 第1个时间
    time_point_t time01 = sys_clk_t::now();
    // 延时5秒
    std::this_thread::sleep_for(std::chrono::duration<int>(5));
    // 第2个时间
    time_point_t time02 = sys_clk_t::now();

    // Step three: 计算时间差
    cout << "dt_time(system_clock period) = " << (time02 - time01).count() << endl;

    typedef duration<int, std::ratio<1, 1000>> mili_sec_t;
    cout << "\ndt_time(user define period) = " << 
    (time_point_cast<mili_sec_t>(time02) - time_point_cast<mili_sec_t>(time01)).count() << endl;
    
    system("pause");
    return 0;
}

运行结果如下:
在这里插入图片描述
system_clock的计时单位是10-7秒。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值