1 综述
简介
- Chrono 这个函数库,主要是为 C++ STL 加入一个可以取得、处理时间与日期的函数库;透过这个函数库,我们可以在程序里面取得时间、并针对时间做处理、计算。而像是 STL Thread 的 sleep_for() 或 sleep_until(),也都是透过 chrono 提供的型别来做设定。
- 头文件:#include , 命名空间:std:chrono
记录时间类别
- chrono 最主要的是下面这两种用来记录时间的类别:
纪录时间点的: time_point
纪录时间长度的: duration
三种时钟
- chrono 有三种时钟 clock: steady_clock, system_clock 和 high_resolution_clock;三者区别:
- steady_clock 是单调的时钟,即每后一次调用都一定会比前一次调用的时间要晚,它并不反映真实的世界时间。在内部的实现中,有可能是系统开启以来的时间。通过该时钟很适合用来获取一段时间内的间隔,它不随系统时间改变而改变。;
- system_clock 是系统的时钟;就是系统时钟,他一般是unix时间,即从1970年1月1日到现在的间隔。因为系统的时钟可以修改;甚至可以网络对时; 所以用系统时间计算时间差可能不准。
- high_resolution_clock 是当前系统能够提供的最高精度的时钟;它也是不可以修改的。相当于 steady_clock 的高精度版本。
Eg: 得到时间差
auto start_t = std::chrono::system_clock::now(); //起始时间
auto end_t = std::chrono::system_clock::now(); //结束时间
std::chrono::duration<double> diff = end_t - start_t;//时间间隔s
std::chrono::duration_cast<std::chrono::milliseconds>(end_t - start_t).count();//时间间隔ms
2. 记录时间类别
2.1 duration
- duration 是 chrono 里面用来记录时间长度的类别,他基本上是一个 template class,可以自行定义他的意义;chrono 也有提供一些比较常见的时间类别,可以直接拿来使用。
下面就是内建的 duration 的型别:
typedef duration<long long, nano> nanoseconds;
typedef duration<long long, micro> microseconds;
typedef duration<long long, milli> milliseconds;
typedef duration<long long> seconds;
typedef duration<int, ratio<60> > minutes;
typedef duration<int, ratio<3600> > hours;
- 如果要取得一个 duration 的值的话,则是要呼叫他的 count() 这个函式。
例如:
std::chrono::minutes t1( 10 ); //代表10min
std::chrono::seconds t2( 60 ); //代表60s
std::chrono::seconds t3 = t1 - t2;
std::cout << t3.count() << " second" << std::endl;
- 如果想要做强制的时间单位转换,也可以使用 duration_cast<>() 这个函式来做;下面就是一个把以秒为单位的 t3 转换成分钟后再输出。
std::cout << std::chrono::duration_cast<chrono::minutes>( t3 ).count() << std::endl;
2.2 time_point
- time_point 是用来记录一个特定时间点的时间类别。他一样是一个 template class,需要指定要使用的 clock 与时间单位(duration)。
std::chrono::steady_clock::time_point t1 = std::chrono::steady_clock::now();
std::cout << "Hello World\n";
std::chrono::steady_clock::time_point t2 = std::chrono::steady_clock::now();
std::cout << "Printing took "
<< std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count()
<< "us.\n";
- time_point 也可以和 duration 做计算,得出新的 time_point。
一般使用
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
std::chrono::system_clock::time_point nt = now + std::chrono::hours(10);
2.3 三种时钟
system_clock的主要方法有3个,分别是:
- now,用来获取当前时间。
- to_time_t,用来将系统时间转变为std::time_t类型。
- from_time_t,用来将std::time_t类型转换为系统时间点。
Eg,使用system_clock获取当前系统时间
#include <iostream>
#include <chrono>
int main() {
auto time = std::chrono::system_clock::now();
auto tt = std::chrono::system_clock::to_time_t(time);
std::cout << std::put_time(std::localtime(&tt), "%Y-%m-%d %H:%M:%S") << std::endl;
return 0;
}
统计函数的执行耗时,这种情况更适合使用steady_clock。
#include <iostream>
#include <chrono>
long fibonacci(unsigned n)
{
if (n < 2) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
int main()
{
auto start = std::chrono::steady_clock::now();
std::cout << "f(42) = " << fibonacci(42) << '\n';
auto end = std::chrono::steady_clock::now();
std::chrono::duration<double> elapsed_seconds = end-start;
std::cout << "elapsed time: " << elapsed_seconds.count() << "s\n";
}