d::chrono::time_point<std::chrono::steady_clock> now1 = std::chrono::steady_clock::now();
auto now2 = std::chrono::steady_clock::now();
3.2,与C-style转换
system_clock 与另外两个 clock 不一样的地方在于,它还提供了两个静态函数用来将 time_point 与 std::time_t 来回转换。
名称 |
说明 |
to_time_t |
将系统时钟时间点转换为 time_t |
from_time_t |
将 time_t 转换到系统时钟时间点 |
第一篇参考链接的文章给出了下面这幅图来描述 c 风格和 c++11 的几种时间类型的转换:
3.3,时长 ratio
为了支持更高精度的系统时钟,C++11
新增了一个新的头文件 <ratio>
和类型,用于自定义时间单位。std::ratio
是一个模板类,提供了编译期的比例计算功能,为 std::chrono::duration 提供基础服务。其声明如下:
template<
std::intmax_t Num,
std::intmax_t Denom = 1
> class ratio;
第一个模板参数 Num
(numerator) 表示分子,第二个参数 Denom
(denominator) 表示分母。typedef ratio<1, 1000> milli;
表示一千分之一,因为约定了基本计算单位是秒,所以 milli
表示一千分之一秒。所以通过 ratio
可以表示毫秒、微秒、纳秒等。
typedef ratio<1,1000000000> nano; // 纳秒单位
typedef ratio<1,1000000> micro; // 微秒单位
typedef ratio<1,1000> milli; // 毫秒单位
typedef ratio<1,1> s // 秒单位
ratio 能表达的数值不仅仅是以 10 为基底的,同时也可以表达任意的分数秒,例如:5/7秒,89/23409 秒等等对于一个具体的 ratio 来说,可以通过 den 获取分母的值,num 获取分子的值。不仅仅如此,
头文件还包含了:
ratio_add,ratio_subtract,ratio_multiply,ratio_divide
来完成分数的加减乘除四则运算。例如,想要计算 5/7+59/1023,可以用以下代码表示:
ratio_add<ratio<5, 7>, ratio<59, 1023>> result;
double value = ((double) result.num) / result.den;
cout << result.num << "/" << result.den << " = " << value << endl;
// 代码输出结果是 5528/7161 = 0.771959
在C++中,如果分子和分母都是整形,则整形除法结果依然是整形,即小数点右边部分会被抛弃,因此想要获取 double
类型的结果,需要先将其转换成 double
。
3.3.1,时长运算
时长对象之间可以进行相加或相减运算。chrono
提供了以下几个常用时长运算的函数:
函数 |
说明 |
duration_cast |
进行时长的转换 |
floor(C++17) |
以向下取整的方式,将一个时长转换为另一个时长 |
ceil(C++17) |
以向上取整的方式,将一个时长转换为另一个时长 |
round(C++17) |
转换时长到另一个时长,就近取整,偶数优先 |
abs(C++17) |
获取时长的绝对值 |
3.4,时间间隔 duration
类模板 std::chrono::duration 表示时间间隔,其声明如下:
template<
class Rep,
class Period = std::ratio<1>
> class duration;
类成员类型描述:
member type |
definition |
notes |
rep |
The first template parameter (Rep ) |
Representation type used as the type for the internal count object. |
period |
The second template parameter (Period ) |
The ratio type that represents a period in seconds. |
duration
由 Rep
类型的计次数和Period
类型的计次周期组成,其中计次周期是一个编译期有理数常量,表示从一个计次到下一个的秒数。存储于 duration 的数据仅有 Rep 类型的计次数。若 Rep 是浮点数,则 duration 能表示小数的计次数。 Period 被包含为时长类型的一部分,且只在不同时长间转换时使用。
Rep
表示一种数值类型,用来表示 Period 的数量,比如 int float double (count of ticks)。
Period
是 std::ratio 类型,用来表示【用秒表示的时间单位】比如 second milisecond (a tick period)。
- 成员函数
count()
返回 Rep
类型的 Period
数量。
常用的 duration<Rep, Period>
已经定义好了,在 std::chrono
头文件中,常用时长单位的代码如下:
/// nanoseconds
typedef duration<int64_t, nano> nanoseconds;
/// microseconds
typedef duration<int64_t, micro> microseconds;
/// milliseconds
typedef duration<int64_t, milli> milliseconds;
/// seconds
typedef duration<int64_t> seconds;
/// minutes
typedef duration<int, ratio< 60>> minutes;
/// hours
typedef duration<int, ratio<3600>> hours;
类型 |
定义 |
std::chrono::nanoseconds |
duration</*至少 64 位的有符号整数类型*/, std::nano> |
std::chrono::microseconds |
duration</*至少 55 位的有符号整数类型*/, std::micro> |
std::chrono::milliseconds |
duration</*至少 45 位的有符号整数类型*/, std::milli> |
std::chro |