推荐用std::chrono::steady_clock测单次执行耗时,因其语义明确、单调不回拨;high_resolution_clock虽精度高但标准不保证单调,实际常与steady_clock同实现。

用 std::chrono::high_resolution_clock 测单次执行耗时
直接拿 std::chrono::high_resolution_clock 的 now() 打点,差值转成纳秒或毫秒最常用。注意它返回的是 time_point,不能直接减,得用 duration_cast 转换:
#include <chrono>
#include <iostream>
<p>auto start = std::chrono::high_resolution_clock::now();
// 你的代码块
for (int i = 0; i < 1000000; ++i) { /<em> ... </em>/ }
auto end = std::chrono::high_resolution_clock::now();</p><p>auto ns = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
std::cout << "耗时: " << ns << " ns\n";
- 别用
clock()或std::clock():它是 CPU 时间,多线程下不准,且分辨率低 -
high_resolution_clock在多数平台(Linux/macOS/MSVC)底层映射到CLOCK_MONOTONIC或QueryPerformanceCounter,稳定不回拨 - 如果只关心毫秒级,用
std::chrono::milliseconds而非nanoseconds,避免整数溢出(尤其长时间运行)
为什么测出来的时间每次都不一样?
单次测量受系统调度、缓存预热、TLB 命中、CPU 频率动态调整等干扰极大,high_resolution_clock::now() 本身开销虽小(通常几十纳秒),但不足以抵消这些噪声。
- 必须重复多次取最小值、中位数或平均值——推荐至少 100 次,剔除首尾 10% 异常值
- 每次测量前加
_mm_pause()(x86)或std::this_thread::yield()可减少线程抢占干扰(非必需,但实测有效) - 关闭 CPU Turbo Boost 和电源管理(如 Linux 的
cpupower frequency-set -g performance)能显著降低方差
steady_clock 和 high_resolution_clock 到底该选哪个?
在几乎所有现代标准库实现中,std::chrono::high_resolution_clock 是 steady_clock 的别名或子集(GCC/Clang/MSVC 均如此),二者都满足单调、不可逆、适合计时的要求。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 优先写
steady_clock:语义更明确,表示“你只关心流逝时间,不关心墙上时间” - 写
high_resolution_clock也没错,但别误以为它“精度更高”——实际精度取决于硬件和 OS,C++ 标准只要求它“尽可能高”,没定义下限 - 绝对不要用
system_clock测执行时间:它可能因 NTP 同步跳变,导致end - start出负数
跨平台编译时发现 high_resolution_clock 不可用?
不是真的不可用,而是某些旧版本 MinGW(如 GCC 4.9)把 high_resolution_clock 实现为空类型,调用 now() 会链接失败。
立即学习“C++免费学习笔记(深入)”;
- 检查编译器版本:
g++ --version,GCC 5.1+ 已修复 - 临时降级方案:改用
steady_clock,它在所有 C++11 兼容实现中都保证可用 - 若必须用
high_resolution_clock且无法升级工具链,可加编译期检测:
#if defined(__GNUC__) && __GNUC__ < 5
using timer_clock = std::chrono::steady_clock;
#else
using timer_clock = std::chrono::high_resolution_clock;
#endif
真正难处理的其实是 Windows 上的 QueryPerformanceCounter 频率漂移问题——不过那是标准库实现该操心的事,用户只需确保用的是主流发行版 STL。

















