chrono 库定义三种主要类型以及工具函数和常用 typedef
·时钟
·时长
·时间点
时钟
时钟由起点(或纪元)及计次频率组成。例如,时钟可以拥有 1970 年 1 月 1 日的纪元,和每一秒的计次。 C++ 定义数种时钟类型
定义于头文件 <chrono>
,定义于命名空间 std::chrono
时钟 | Value |
---|---|
system_clock (C++11) | 来自系统范畴实时时钟的挂钟时间(类) |
steady_clock (C++11) | 决不会调整的单调时钟(类) |
high_resolution_clock(C++11) | 拥有可用的最短嘀嗒周期的时钟(类) |
is_clock(C++20) | 确定类型是否为时钟 (Clock)(类模板) (变量模板) |
utc_clock(C++20) | 协调世界时 (UTC) 的时钟 (Clock)(类) |
tai_clock(C++20) | 国际原子时 (TAI) 的时钟 (Clock)(类) |
gps_clock(C++20) | GPS 时间的时钟 (Clock)(类) |
file_clock(C++20) | 用于文件时间的时钟 (Clock)(typedef) |
local_t(C++20) | 表示本地时间的伪时钟 (类) |
时间点
时间点是从特定时钟的纪元开始经过的时间时长。
定义于头文件 <chrono>
,定义于命名空间 std::chrono
时间点 | Value |
---|---|
time_point(C++11) | 时间中的点(类模板) |
clock_time_conversion(C++20) | 定义如何转换一个时钟的时间点为另一个的特性类(类模板) |
clock_cast(c++20 | 转换一个时钟的时间点为另一个(函数模板) |
时长
时长由时间跨度组成,定义为某时间单位的某个计次数。例如,“ 42 秒”可表示为由 42 个 1 秒时间点位的计次所组成的时长。
定义于头文件 <chrono>
,定义于命名空间 std::chrono
时间点 | Value |
---|---|
duration(C++11) | 时间区间(类模板) |
template<
class Rep,
class Period = std::ratio<1>
> class duration;
下面列举了一些由类模板duration衍生出来的时长数据类型
类型 | 定义 |
---|---|
std::chrono::nanoseconds | duration</至少 64 位的有符号整数类型/, std::nano> |
std::chrono::microseconds | duration</至少 55 位的有符号整数类型/, std::micro> |
std::chrono::milliseconds | duration</至少 45 位的有符号整数类型/, std::milli> |
std::chrono::seconds | duration</至少 35 位的有符号整数类型/> |
std::chrono::minutes | duration</至少 29 位的有符号整数类型/, std::ratio<60> > |
std::chrono::hours | duration</至少 23 位的有符号整数类型/, std::ratio<3600> > |
一个简单的例子
#include <iostream>
#include <chrono>
#include <ctime>
long fibonacci(unsigned n)
{
if (n < 2) return n;
return fibonacci(n-1) + fibonacci(n-2);
}
int main()
{
auto start = std::chrono::system_clock::now();
std::cout << "f(42) = " << fibonacci(42) << '\n';
auto end = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds = end-start;
std::time_t end_time = std::chrono::system_clock::to_time_t(end);
std::cout << "finished computation at " << std::ctime(&end_time)
<< "elapsed time: " << elapsed_seconds.count() << "s\n";
}
可能的输出:
f(42) = 267914296
finished computation at Mon Oct 2 00:59:08 2017
elapsed time: 1.88232s