《C++标准库》学习笔记 — 通用工具 — Clock 和 Timer
一、Chrono 程序库概观
Chrono 程序库的设计,是希望能够处理timer 和 clock在不同系统中可能不同的事实,同时也是为了强化时间精度。为避免像 POSIX 的 tine 程序库那样每十年就引入一个新的时间类型,C++标准库的目标是提供一个精度中立概念,把 duration(时间段) 和 timepoint(时间点) 从特定 clock(始终) 区分开来。最终结果就是 chrono 程序库核心由以下类型或概念组成,形成一个抽象层:
(1)所谓 duration 值得是在某时间单位上的一个明确的 tick(片刻数)。举个例子,3分钟时间段意指3个1分钟。其中 3 是片刻数,而 1分钟 是时间单位。
(2)所谓 timepoint 的意思是一个 duration 和一个 epoch(起点) 的组合。典型例子是 2000年新年午夜 时间点,它被描述为 自1970年1月1日开始的第1262300400秒。
(3)timepoint 的概念其实是以某个 clock 为参数。clock 是个对象,定义 timepoint 的 epoch。不同的 clock 有着不同的 epoch。一般而言,当操作函数处理多个 timepoint,例如计算两个 timepoint 之间的差距时,必须采用相同的 epoch/clock。
二、duration
Duration 是一个数值(表示 tick 个数)和一个分数(表现时间单位,以秒计)的组合。其中的分数由 class ratio 描述。例如:
std::chrono::duration<double, std::ratio<60>> halfAMinute(0.5);
此类型表示的是以60秒为 duration 单位的数据,0.5表示0.5个 tick。
为了提供更多的方便性,C++标准库提供了各个时间单位的定义:
1、duration的算术运算
duration 提供了许多操作符:
运算符的左右操作符的单位类型可以不同,它们的运算结果的时间单位是两个操作数的单位的最大公约数。需要注意的是,我们可以将高精度的时间隐式转换为低精度,反过来却不行。例如:
#include <iostream>
#include <ratio>
#include <chrono>
#include <vector>
#include <ctime>
int main()
{
using namespace std;
using namespace chrono;
seconds tenSeconds(10);
minutes fiveMinutes(5);
cout << boolalpha << (tenSeconds < fiveMinutes) << endl;
duration<int, ratio<1, 2>> ThreeHalfSeconds(2);
duration<int, ratio<1, 3>> fiveOneThirdSeconds(5);
cout << ThreeHalfSeconds + fiveOneThirdSeconds << endl;
cout << ThreeHalfSeconds - fiveOneThirdSeconds