chrono
std::chrono 是 C++11 提供的时间库,统一了“时间点、时长、时钟”这三类概念。
它最大的价值是类型安全:毫秒、秒、分钟不会随意混用,时间换算可以由编译器和模板系统协助完成。
头文件与核心类型
使用时通常包含:
#include <chrono>
核心类型:
duration:表示时间长度,例如 10ms、2s。time_point:某个时钟上的时间点。clock:时钟来源,常见有system_clock、steady_clock、high_resolution_clock。
基本用法
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono;
auto d = milliseconds(1500);
std::cout << duration_cast<seconds>(d).count() << '\n';
}
count() 用来取底层数值,duration_cast 用于显式单位转换。
交互演示(MDX + React)
下面面板可以演示 duration 单位换算,以及一个简化版 steady_clock 计时流程(start/lap/stop/reset):
chrono 交互演示
MDX + Reactmilliseconds: 1234 ms
seconds: 1.234 s
minutes: 0.020566666666666667 min
microseconds: 1234000 us
steady_clock 模拟累计耗时: 0 ms
running: false
常见时钟
| 时钟 | 特点 | 场景 |
|---|---|---|
system_clock | 代表系统真实时间,可转日历时间 | 打日志、时间戳 |
steady_clock | 单调递增,不受系统校时影响 | 计时、超时判断 |
high_resolution_clock | 平台上分辨率最高(实现相关) | 高频计时 |
计时示例:
#include <chrono>
#include <iostream>
int main() {
auto start = std::chrono::steady_clock::now();
// do work
auto end = std::chrono::steady_clock::now();
auto cost = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
std::cout << cost.count() << " us\n";
}
与线程配合
chrono 常与 <thread> 联用:
#include <chrono>
#include <thread>
std::this_thread::sleep_for(std::chrono::milliseconds(100));
这在轮询、限流和重试间隔里非常常见。
使用注意
- 性能计时优先
steady_clock,不要直接用system_clock。 - 做单位转换时尽量显式使用
duration_cast。 - 别忘了
count()返回的是纯数值,单位语义在类型里。 - 跨模块传参时,建议直接传
duration类型而不是裸整数。
小结
std::chrono 让时间处理从“整数 + 注释约定”升级成了“强类型 + 明确单位”。掌握 duration、time_point、clock 三件套后,计时、超时控制和时间换算都会更稳定。