本文主要是介绍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: 定义一个clocktypedef 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秒。
这篇关于std::chrono库的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!