—-想了解C++中Boost.Chrono时间库的使用方法分享的全部内容且更多的C语言教程关注<计算机技术网(www.ctvol.com)!!>
前言
大家应该都有所体会,时钟这个东西在程序中扮演者重要的角色,在系统编程的时候睡眠、带超时的等待、带超时的条件变量、带超时的锁都会用到,但是往往对特定系统依赖性很大,感觉即使不考虑系统的跨平台性,如果能使用一个稳定的接口,同时如果能够方便的对时刻、时段等进行相关的操作和运算,将是再好不过的了。
在boost库中和时间相关的库有Boost.DateTime和Boost.Chrono,前者专注于时间时刻以及本地化相关的内容,而后者主要是时刻、时长和时间的计算等内容。当然,C++11标准已经支持std::chrono了,但是为了兼容老编译系统现在很多C++库和程序都使用boost.chrono作为时间类库(还有的原因就是std::chrono没有收录boost.chrono的所有功能,比如统计CPU使用时间、自定义时间输出格式等),不过比较可惜的是即便使用boost::chrono作为权宜之计,也需要boost-1.47版本之上才行,而现在比较旧的发行版需要升级boost库才可以使用。想想现在RHEL-6.x仍然被大规模的部署,而且RedHat要为这货提供长达十年的技术支持,真不知道啥时候才能顺顺利利的享受C++11……
Boost.Chrono的时间类型分为duration和time_point,也就是时长和时刻两类,很多概念和接口都是围绕这两个维度去定义和实现的。
一、Clock
clock是Boost.Chrono中的重要概念,而且这些clock都包含一个now()
的成员函数,用于返回当前的time_point。Boost.Chrono包含的clock类型有:
(1) chrono::system_clock
代表系统时间,比如电脑上显示的当前时间,其特点是这个时间可以被用户手动设置更新,所以这个时钟是可以和外部时钟源同步的。这个时钟还有一个to_time_t()
成员函数,用于返回自1970.1.1开始到某个时间点所经过的秒数,数据类型是std::time_t
。这种时钟通常用来转换成日历时间使用。
(2) chrono::steady_clock
其特点是时间是单调增长的,后一个时刻访问得到的时间点肯定比之前时刻得到的时间点要晚,即使我们手动将系统时间向前调整了也不会改变这个时钟稳步向前推行累计,其也被称为monotonic time,该时钟是均匀增长且不能被调整,其特性对于很多不允许时间错乱的系统是十分重要的。chrono::steady_clock
通常是基于系统启动时间来计时的,而且常常用来进行耗时、等待等工作使用。
(3) chrono::high_resolution_clock
依赖于系统实现,通常是上面两种时钟的某个宏定义,取决于哪个时钟源更为的精确,所以其输出也决定于取决于上面哪个clock来实现的。
(4) chrono::process_real_cpu_clock
表示自进程启动以来使用的CPU时间,而这个数据也可以通过使用std::clock()来获得。chrono::process_user_cpu_clock
、boost::chrono::process_system_cpu_clock
表示自进程启动以来,在用户态、内核态所花费的时间,而所有的这些事件可以通过chrono::process_cpu_clock
来获得,他返回上面所有时间组成的一个tuple结构。
(5) chrono::thread_clock
返回基于线程统计的花费时间,而且不区分用户态、内核态的时间。
二、time_point
time_point代表时间点,其等价于某个时刻(clock)+duration的结果,同时两个time_point做减法也可以得到一个duration。time_point常见的描述为:3分钟之后、2038年1月1日10:32:23、定时器启动后的20ms……
上面的clock都有一个now()成员函数,其返回的就是chrono::time_point
类型。这个类型使用一个模板来实现的,所以其实际类型极度依赖于所选择的时钟源。
Boost.Chrono有一个chrono::time_point_cast
转换函数,可以显式从高粒度向低粒度对time_point进行转换。
chrono::process_real_cpu_clock::time_point p = chrono::process_real_cpu_clock::now(); std::cout << chrono::time_point_cast<minutes>(p) << 'n';
三、duration
关于时长,chrono::duration
也是一个模板类型,其第一个模板参数表明存储所用的数据类型(int、long、double等),第二个模板参数表示ratio(比如24、60、1000等)。为了方便用户的使用,Boost.Chrono提供了duration常用的六种时间类型,且他们都用一个足够大的整数进行内部保存,其计量值可以用count()
成员函数得到:
chrono::nanoseconds
、chrono::milliseconds
、chrono::microseconds
、chrono::seconds
、chrono::minutes
、chrono::hours
,而且为这些类型都重载了计算操作符:+、-、<等,方便时间的计算和比较。文档说传统的Boost.DateTime
是用继承实现的,相比而言Boost.Chrono更加的简洁高效,而且和前者保持了一致的接口。
chrono::steady_clock::time_point start = chrono::steady_clock::now(); ... chrono::duration<double> sec = chrono::steady_clock::now() - start; std::cout << "we took " << sec.count() << " secondsn"; auto go = chrono::steady_clock::now() + chrono::nanoseconds(500); while (chrono::steady_clock::now() < go) ... ;
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/488487.html