最稳妥的性能测试时钟是std::chrono::steady_clock,因其单调且不受系统时间调整影响;high_resolution_clock虽精度高但语义不如steady_clock明确;需用duration_cast转换time_point差值,避免直接使用count()或错误cast导致截断。
用 std::chrono::high_resolution_clock 获取真实运行时间
直接用 std::chrono::high_resolution_clock 是最稳妥的选择,它在绝大多数平台(Linux/macOS/Windows)上都映射到系统最高精度的单调时钟源。不要用 std::chrono::system_clock,它受系统时间调整影响,测性能会出错。
关键点:
-
high_resolution_clock::now()返回的是一个time_point,不能直接相减得秒数,必须用duration_cast - 测量前建议调用一次
now()预热,避免首次调用因缓存/TLB未命中带来偏差 - 如果只测一次短操作,务必循环多次再取平均,单次
nanoseconds级别可能被噪声淹没
auto start = std::chrono::high_resolution_clock::now(); // your code here auto end = std::chrono::high_resolution_clock::now(); auto ns = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
为什么 std::chrono::steady_clock 更适合性能测试
steady_clock 是单调递增、不受系统时间修改干扰的时钟,C++11 起就保证其“稳定”,比 high_resolution_clock 语义更明确。虽然部分旧编译器(如 GCC 4.8)里它和 system_clock 同义,但现代标准下它才是性能测试的首选。
常见误用:
立即学习“C++免费学习笔记(深入)”;