大家平时工作,如果有计算函数耗时或者打印当前时间的需求,一定要来看看这篇文章!
首先介绍下C++标准中的chrono库
chrono
是一个关于时间的库,起源于boost
,现在是C++
的标准,话说现在的C++
标准好多都是源于boost
,要进标准的特性似乎都会先在boost
试验一番。
首先看一下使用「chrono」简单计时的示例代码:
void func() { // 计时
std::chrono::time_point<std::chrono::high_resolution_clock> begin = high_resolution_clock::now();
std::this_thread::sleep_for(std::chrono::milliseconds(20));
auto end = high_resolution_clock::now();
cout << "time " << duration_cast<milliseconds>(end - begin).count() << endl;
}
chrono
中有三个概念「duration、time_point、clock」
「duration」:表示一段时间,三分钟、三秒等,它的定义如下:
template <class _Rep, class _Period = ratio<1>> class duration;
ratio的定义如下:
template <intmax_t N, intmax_t D = 1> class ratio;
Rep
表示数据类型,int
,long
等,Period
表示时间单位,N是分子,D是分母,直接看例子吧:
using atto = ratio<1, 1000000000000000000LL>;
using femto = ratio<1, 1000000000000000LL>;
using pico = ratio<1, 1000000000000LL>;
using nano = ratio<1, 1000000000>;
using micro = ratio<1, 1000000>;
using milli = ratio<1, 1000>;
using centi = ratio<1, 100>;
using deci = ratio<1, 10>;
using deca = ratio<10, 1>;
using hecto = ratio<100, 1>;
using kilo = ratio<1000, 1>;
using mega = ratio<1000000, 1>;
using giga = ratio<1000000000, 1>;
using tera = ratio<1000000000000LL, 1>;
using peta = ratio<1000000000000000LL, 1>;
using exa = ratio<1000000000000000000LL, 1>;
using nanoseconds = duration<long long, nano>;
using microseconds = duration<long long, micro>;
using milliseconds = duration<long long, milli>;
using seconds = duration<long long>;
using minutes = duration<int, ratio<60>>;
using hours = duration<int, ratio<3600>>;
using hours2 = duration<int, ratio<3600, 1>>;
using hours2 = duration<int, ratio<7200, 2>>;
详细看完上述例子您也明白了,ratio的默认的时间单位是1秒,以小时为例,一小时等于3600秒,3600 / 1 == 7200 / 2 == 3600,所以hours == hours2 == hours3。
标准库还提供了duration_cast
用于转换各种duration
。
template <class _To, class _Rep, class _Period, enable_if_t<_Is_duration_v<_To>, int> = 0>
constexpr _To duration_cast(const duration<_Rep, _Period>&) noex