std::chrono::steady_clock配合duration_cast<microseconds>是跨平台测微秒耗时最可靠方案,它单调稳定、分辨率高,且避免了high_resolution_clock在MinGW等环境下的退化问题。

用 std::chrono::high_resolution_clock 测微秒级耗时最可靠
在 Linux/macOS/Windows(MSVC/GCC/Clang)下,std::chrono::high_resolution_clock 是 C++11 起最通用、开销最小的高精度时钟,它底层通常映射到系统最高精度计时器(如 CLOCK_MONOTONIC 或 QueryPerformanceCounter),能稳定输出纳秒或微秒级分辨率。别用 std::clock() 或 gettimeofday() —— 前者是 CPU 时间且精度差,后者已废弃且非标准。
duration_cast<microseconds> 是唯一安全转微秒的方式
直接对 high_resolution_clock::time_point 做减法得到的是 duration 类型,不能直接当整数用。必须显式转换,否则可能截断、溢出或触发隐式转换警告。
常见错误写法:auto us = end - start; → 类型是 nanoseconds 或更粗粒度的 duration,不是微秒auto us = (end - start).count(); → 单位不确定,GCC 可能是纳秒,Clang 在某些配置下可能是毫秒
正确做法:
立即学习“C++免费学习笔记(深入)”;
#include <chrono> auto start = std::chrono::high_resolution_clock::now(); // ... 你的代码块 ... auto end = std::chrono::high_resolution_clock::now(); auto us = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
-
duration_cast会向下取整(如 1234 ns → 1 µs),不四舍五入 - 若需更高精度,可先转
nanoseconds再除以 1000.0 得 double 微秒值 - 避免嵌套 cast,比如
duration_cast<microseconds>(duration_cast<nanoseconds>(end-start))—— 多余且易错
注意 high_resolution_clock 的“高分辨率”不等于“高稳定性”
它的分辨率是高的,但两次调用之间可能有几十纳秒抖动,尤其在低负载或虚拟机中。单次测量意义有限,真实压测需多次运行取最小值或中位数。
- 别用它测
< 1 µs的操作(比如空循环、单条赋值)—— 结果基本是噪声 - 避免在循环内反复调用
now():每次调用本身约 20–100 ns 开销,会污染结果 - 如果要测函数调用开销,确保编译器没内联或优化掉目标代码(加
volatile或用参数依赖防止优化) - Windows 下 MinGW 的
high_resolution_clock有时退化为毫秒级,建议用steady_clock替代(它保证单调+稳定,精度也足够)
跨平台兼容写法推荐用 steady_clock
虽然标题写的是 high_resolution_clock,但实际项目中更推荐 std::chrono::steady_clock:它不随系统时间调整跳变,行为更可预测,且现代标准库实现中,它的分辨率和 high_resolution_clock 几乎一致。
auto start = std::chrono::steady_clock::now();
// ... code ...
auto us = std::chrono::duration_cast<std::chrono::microseconds>(
std::chrono::steady_clock::now() - start
).count();
真正容易被忽略的点:微秒值本身只是相对差值,它不反映 CPU 缓存命中率、分支预测失败或 TLB miss 等底层开销;想定位性能瓶颈,得配合 perf / VTune / Instruments 这类工具,而不是只看这个数字。


















