chrono 是 C++ 标准库中的一个命名空间,包含了一组用于处理时间和时间相关操作的类和函数
头文件
#include <chrono>
基本组成
Durations(时间段)
用来表示一个时间段, duration类是一个模板类,它的模板定义如下
template <class Rep, class Period = std::ratio<1>>
class duration;
- Rep 为一种数值类型,duration用这个类型来表示 Period 的数量,比如int float double
Period 表示用秒表示时间单位的类型, ratio 这个类用来表示一个比例, 有两个参数,第一个为分zi,第二个为分母, 第二个默认值为 1, 比如 ratio<1, 1> 就代表一秒, ratio<60, 1> 就代表一分钟, ratio<1, 1000>代表一毫秒。
常用的duration也可以使用预设好的如下,都是 预设好参数的 的 duration 类:第一个参数使用的long long, 所以表示的是整数。例如std::chrono::seconds的定义为
using seconds=duration<long long>;
- 纳秒(nanoseconds):std::chrono::nanoseconds
- 微秒(microseconds):std::chrono::microseconds
- 毫秒(milliseconds):std::chrono::milliseconds
- 秒(seconds):std::chrono::seconds
- 分钟(minutes):std::chrono::minutes
- 小时(hours):std::chrono::hours
示例
#include <iostream> #include <chrono> #include <ratio> using namespace std; int main() { // std::milli 定义为 ratio<1, 1000> chrono::duration<int, std::milli> duration1(500); // 创建一个表示500毫秒的duration对象 chrono::duration<double, std::ratio<1>> duration2(2.5); // 创建一个表示2.5秒的 duration对象 chrono::duration<float, std::ratio<1>> duration3 = duration1 + duration2; // 创建一个表示3秒的duration对象 cout << duration3.count() << endl; // 输出1.1 返回Duration对象表示的时间段值,以它所定义的时间单位返回 //使用预设好的duration chrono::seconds duration4(10); 代表 10 秒 cout << duration4.count() << endl; // 输出10 }
duration还支持与duration加减和与数字乘除运算符和关系运算符的重载。
- 使用 duration_cast 可以在不同的duration类型之间转换duration_cast 使用和c++的四种类型转换类似
- 还可以使用 this_thread::sleep_for配合duration类进行延时, 例如
this_thread::sleep_for(chrono::seconds(2))
time_point(时间点)
顾名思义就是用于表示具体时间的类型,表示某个具体时刻的时间点
基本用法
#include <iostream>
#include <chrono>
using namespace std::chrono;
int main() {
// 获取当前时间
system_clock::time_point now = system_clock::now();
time_t now_c = system_clock::to_time_t(now);
std::cout << "当前时间: " << ctime(&now_c);
// 创建一个用时间戳表示特定时间点的time_point
system_clock::time_point specific_time =
system_clock::time_point(std::chrono::seconds(1718879552));
now_c = system_clock::to_time_t(specific_time);
std::cout << "特定时间点: " << ctime(&now_c);
}
time_point支持与duration加减运算符和关系运算符的重载。
clock(时钟)
三种不同类型的时钟:
- system_clock
是系统级别的时钟,它的时间点是与系统的时钟相关联的,调整系统时间会影响 system_clock - steady_clock
是一个单调递增的时钟,不受系统时间调整的影响。适合用于测量时间间隔和计算算法的执行时间。 - high_resolution_clock
high_resolution_clock是一个可用于测量小时间间隔的时钟。它通常使用最高分辨率的时钟源来提供更高的时间精度,是system_clock或者steady_clock中更高分辨率的别名,在大部分平台上是steady_clock的别名
他们都可以用来获取当前时间
示例
#include <iostream>
#include <chrono>
using namespace std::chrono;
int main() {
// 获取当前时间
system_clock::time_point now1 = system_clock::now();
steady_clock::time_point now2 = steady_clock::now();
system_clock::time_point now3 = high_resolution_clock::now();
}
用steady_clock来 测量代码执行时间
#include <iostream>
#include <chrono>
#include <thread>
using namespace std::chrono;
int main() {
// 获取当前时间
steady_clock::time_point now1 = steady_clock::now();
// 耗时的操作
std::this_thread::sleep_for(std::chrono::seconds(2));
// 获取当前时间
steady_clock::time_point now2 = steady_clock::now();
std::cout << "时间差:" << duration_cast<milliseconds>(now2 - now1).count() << "ms" << std::endl;
}