跳到主要内容
版本:1.0

chrono

std::chrono 是 C++11 提供的时间库,统一了“时间点、时长、时钟”这三类概念。

它最大的价值是类型安全:毫秒、秒、分钟不会随意混用,时间换算可以由编译器和模板系统协助完成。

头文件与核心类型

使用时通常包含:

#include <chrono>

核心类型:

  1. duration:表示时间长度,例如 10ms、2s。
  2. time_point:某个时钟上的时间点。
  3. clock:时钟来源,常见有 system_clocksteady_clockhigh_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 + React

milliseconds: 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));

这在轮询、限流和重试间隔里非常常见。

使用注意

  1. 性能计时优先 steady_clock,不要直接用 system_clock
  2. 做单位转换时尽量显式使用 duration_cast
  3. 别忘了 count() 返回的是纯数值,单位语义在类型里。
  4. 跨模块传参时,建议直接传 duration 类型而不是裸整数。

小结

std::chrono 让时间处理从“整数 + 注释约定”升级成了“强类型 + 明确单位”。掌握 durationtime_pointclock 三件套后,计时、超时控制和时间换算都会更稳定。