c++oding="utf-8" ?>
std::chrono::steady_clock是测执行时间的首选,它在主流实现中等价于high_resolution_clock且语义更明确;实际纳秒级测量受系统抖动影响,需多次运行取最小值而非平均值。

用 std::chrono::high_resolution_clock 获取纳秒级时间差
标准库中唯一能稳定提供纳秒级精度(或接近)的时钟是 std::chrono::high_resolution_clock,但它不保证底层分辨率就是 1 纳秒——实际取决于系统和编译器。Linux 上通常基于 CLOCK_MONOTONIC 或 CLOCK_MONOTONIC_RAW,Windows 上用 QueryPerformanceCounter,两者在现代硬件上普遍支持纳秒量级计时,但测量值仍是离散的。
关键不是“能不能写成纳秒单位”,而是“能不能可靠分辨纳秒级差异”。实测中,两次紧邻调用 now() 的最小可测差值常为 10–100 ns(取决于 CPU 和内核调度),所以对极短代码块(比如几条赋值语句),直接单次测量意义不大。
实操建议:
- 用
auto start = std::chrono::high_resolution_clock::now();和auto end = std::chrono::high_resolution_clock::now();包裹待测代码 - 差值转纳秒:用
std::chrono::duration_cast<:chrono::nanoseconds>(end - start).count()</:chrono::nanoseconds> - 避免把
std::cout、函数调用、内存分配等干扰项塞进被测块里 - 单次结果波动大,必须循环多次取最小值或中位数(见下节)
为什么不能只测一次?——抖动来源和应对方式
你看到的 1274 ns 可能下一秒变成 8923 ns,这不是计时不准,而是真实开销混入了 OS 调度、TLB miss、CPU 频率切换、缓存预热、中断响应等噪声。尤其在笔记本或虚拟机中,抖动可能高达微秒级。
有效做法不是“平均”,而是“找下界”:
- 重复执行被测代码 1000–10000 次,每次记录耗时,取最小值 —— 它最接近“纯代码路径”的理论下限
- 用
RDTSC(x86)虽更底层,但需处理乱序执行、序列化指令(如lfence),且跨平台性归零,不推荐日常使用 - 禁用 CPU 频率缩放(
sudo cpupower frequency-set -g performance)和后台进程能显著收窄分布 - 开启编译器优化(
-O2或-O3)再测,否则测的是未优化的 AST 解释开销,不是真实性能
std::chrono::steady_clock 和 high_resolution_clock 到底选哪个?
std::chrono::steady_clock 是单调、不回跳的时钟,适合测间隔;high_resolution_clock 是“实现定义的最高分辨率时钟”,在绝大多数主流 STL 实现(libstdc++、libc++、MSVC STL)中,它就是 steady_clock 的别名,或者直接继承自它。C++20 起标准已明确鼓励将二者统一。
所以不必纠结选谁:
- 优先写
std::chrono::steady_clock—— 语义清晰,意图明确,且完全满足纳秒级差值需求 - 如果文档或旧代码里用了
high_resolution_clock,不用改,效果一样 - 绝对不要用
system_clock测执行时间,它反映的是挂钟时间,可能因 NTP 校正而跳变
一个最小可行示例(带防优化和循环)
下面这段代码测的是一个空循环的开销,重点看结构而非内容:
#include <chrono>
#include <algorithm>
#include <vector><p>int main() {
volatile int dummy = 0; // 防止整个循环被优化掉
std::vector<long long> times;</long></p>
<pre class="brush:php;toolbar:false;">for (int i = 0; i (end - start).count()
);
}
std::sort(times.begin(), times.end());
printf("Min: %lld ns\n", times.front()); // 看最小值,不是平均值
}
注意 volatile 和循环体内容——没有它,编译器可能把整个块吃掉;也注意 times.front() 而非 accumulate,这是实操中容易忽略的关键点:你要的不是“平均耗时”,而是“这段逻辑最快能跑多快”。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











