steady_clock 是获取 wall time 的首选,因其单调递增且不受系统时钟调整影响;正确用法是两次 steady_clock::now() 相减后用 duration_cast 转换单位,不可直接 count() 或当绝对时间打印。

为什么 steady_clock 是获取 wall time 的首选
因为它是单调递增、不受系统时钟调整影响的时钟,适合测真实耗时。用 system_clock 可能因 NTP 调整或手动改系统时间导致负值或跳变;high_resolution_clock 在某些平台(如旧版 MSVC)只是 system_clock 的别名,不保证稳定。
实际项目中只要想测“这段代码到底跑了多久”,就该无条件选 steady_clock。
如何正确使用 steady_clock::now() 计算耗时
核心是两次调用 steady_clock::now(),相减后转成所需单位。注意:返回值是 duration 类型,不能直接当秒数用。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 必须用
duration_cast显式转换,比如duration_cast<:microseconds>(end - start)</:microseconds> - 不要用
.count()直接取原始 tick 数——它依赖实现,可读性差且易溢出 - 避免跨线程复用同一个
time_point变量,尤其在异步或回调中
#include <chrono> auto start = std::chrono::steady_clock::now(); // ... do work ... auto end = std::chrono::steady_clock::now(); auto us = std::chrono::duration_cast<:chrono::microseconds>(end - start).count(); </:chrono::microseconds></chrono>
常见错误:把 steady_clock::time_point 当作绝对时间打印
steady_clock 的 time_point 没有纪元(epoch),不能转成 Unix 时间戳,也不能用 std::put_time 格式化输出。一旦你看到类似 “error: no matching function for call to ‘to_time_t’” 或输出乱码时间,基本就是误用了。
- 想打日志时间戳?改用
system_clock::now() - 想看相对耗时?只做差值,别尝试
time_point.time_since_epoch()除以 1s —— 这个 epoch 是实现定义的,毫无业务意义 - 调试时临时打印?可用
auto ns = duration_cast<nanoseconds>(tp.time_since_epoch()).count()</nanoseconds>看 raw 数值,但仅限调试
跨平台兼容性要注意的细节
Clang/GCC 通常没问题,但 Windows 上 MSVC 2015–2019 的 steady_clock 实现曾有 15ms 左右的精度下限(底层用 QueryPerformanceCounter 但初始化不当)。如果你测的是 sub-millisecond 级别操作,得实测确认:
- 运行一次空循环测最小可分辨间隔:
auto d = duration_cast<nanoseconds>(steady_clock::now() - steady_clock::now()).count()</nanoseconds> - C++20 起可考虑
std::chrono::utc_clock配合steady_clock做对齐,但目前实用场景极少 - 嵌入式或实时环境?确认编译器是否开启
-D_GLIBCXX_USE_CLOCK_GETTIME(Linux)或启用高精度 API
真正难的不是写对那两行 now(),而是意识到 wall time 测量永远受 OS 调度、CPU 频率变化、缓存预热等干扰——同一段代码跑十次,取中位数比单次结果靠谱得多。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










