1、chrono介绍
chrono
是 C++ 标准库中的一个头文件,提供了处理日期、时间、时钟等时间相关操作的功能。它在 C++11 标准中引入,提供了更方便、更强大的时间处理功能。
1.1 类:
std::chrono::duration
: 代表时间段,可以表示一段时间的长度,以不同的时间单位表示,例如秒、毫秒、微秒等。
std::chrono::time_point
: 代表时间点,它是相对于某个时间点的持续时间。
std::chrono::system_clock
: 提供了当前的系统时间,可以用来获取当前时间点。
std::chrono::steady_clock
: 与 system_clock
类似,但提供的时间点递增稳定,不受系统时间调整的影响。
std::chrono::high_resolution_clock
: 提供了最高精度的时钟,通常基于 steady_clock
实现。
这些类可以用来执行各种时间相关的操作,比如测量时间间隔、等待一段时间、处理时间点等。使用 <chrono>
库可以帮助你编写更加可靠
和可移植的时间相关代码。
1.2 类型别名:
常用的类型别名和函数,以简化时间相关操作的代码编写。
std::chrono::milliseconds
、std::chrono::seconds
、std::chrono::minutes
、std::chrono::hours
等:代表不同时间单位的类型别名,用于表示时间段(duration)的长度。
/// nanoseconds
using nanoseconds = duration<_GLIBCXX_CHRONO_INT64_T, nano>;/// microseconds
using microseconds = duration<_GLIBCXX_CHRONO_INT64_T, micro>;/// milliseconds
using milliseconds = duration<_GLIBCXX_CHRONO_INT64_T, milli>;/// seconds
using seconds = duration<_GLIBCXX_CHRONO_INT64_T>;/// minutes
using minutes = duration<_GLIBCXX_CHRONO_INT64_T, ratio< 60>>;/// hours
using hours = duration<_GLIBCXX_CHRONO_INT64_T, ratio<3600>>;
1.3 函数:
std::chrono::duration_cast
:用于将一个时间段转换为另一个时间段的函数。
std::chrono::time_point_cast
:用于将一个时间点转换为另一个时间点的函数。
std::chrono::duration::count
:返回时间段的长度,以其持续时间单位计数的函数。
std::chrono::time_point::time_since_epoch
:返回时间点相对于纪元的持续时间的函数。
std::chrono::system_clock::now
:获取当前系统时间点的函数。
std::chrono::steady_clock::now
:获取当前稳定时钟时间点的函数。
std::chrono::high_resolution_clock::now
:获取当前高分辨率时钟时间点的函数。
通过使用这些类型别名和函数,可以更方便地进行时间相关的计算和操作。
2、demo
2.1测量程序执行时间:
#include <iostream>
#include <chrono>int main() {auto start = std::chrono::steady_clock::now();// 模拟一个耗时操作for (int i = 0; i < 1000000; ++i) {// Do something}auto end = std::chrono::steady_clock::now();auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();std::cout << "程序执行时间: " << duration << " 毫秒\n";return 0;
}
2.2等待一段时间:
#include <iostream>
#include <chrono>
#include <thread>int main() {std::cout << "开始等待...\n";// 等待 1 秒钟std::this_thread::sleep_for(std::chrono::seconds(1));std::cout << "等待结束\n";return 0;
}
2.3获取当前系统时间:
#include <iostream>
#include <chrono>
#include <ctime>int main() {auto now = std::chrono::system_clock::now();auto time = std::chrono::system_clock::to_time_t(now);std::cout << "now time: " << std::ctime(&time) << std::endl;return 0;
}
2.4定时执行任务:
#include <iostream>
#include <chrono>
#include <thread>void task() {std::cout << "任务执行\n";
}int main() {std::cout << "开始定时执行任务\n";// 每隔1秒执行一次任务while (true) {task();std::this_thread::sleep_for(std::chrono::seconds(1));}return 0;
}
2.5格式化打印当前时间:
#include <iostream>
#include <iomanip>
#include <chrono>
#include <ctime>int main() {// 获取当前时间点auto now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());// 将时间点转换为 struct tm 结构体,以便可以使用 std::put_time 函数进行格式化struct std::tm* time_info = std::localtime(&now);// 使用 std::put_time 格式化时间并将其存储为字符串std::stringstream ss;ss << std::put_time(time_info, "%Y-%m-%d %H:%M:%S");std::string time_str = ss.str();std::cout << "Current time as string: " << time_str << std::endl;return 0;
}