应使用 std::chrono::steady_clock 进行性能计时,因其单调递增、不受系统时间调整影响;避免 system_clock 和依赖 high_resolution_clock 别名;需显式 duration_cast 转换单位,防止整数截断;确保被测代码不被编译器优化掉,可借助 volatile 或内存屏障;注意 windows 下 qpc 漂移问题。

chrono 计时不准?先确认你用的是 steady_clock
默认用 system_clock 会受系统时间调整影响,比如 NTP 同步、手动改时间,导致测出来的时间跳变甚至倒流。性能分析必须用单调递增的时钟。
- 用
std::chrono::steady_clock:保证“物理时间流逝”和“时钟值增长”严格正相关 -
high_resolution_clock在多数实现里是steady_clock的别名,但不保证——别依赖它 - 别用
system_clock::now()做耗时测量,哪怕只差几行代码也容易埋坑
怎么写一个靠谱的微秒级耗时测量片段
常见错误是直接减两个 time_point 得到 duration 后不显式转换单位,结果除以 1000 或 1e6 时整数截断或溢出。
- 用
std::chrono::duration_cast<:chrono::microseconds>(end - start).count()</:chrono::microseconds>显式转成整数微秒 - 如果要纳秒级,用
nanoseconds,但注意 x86_64 上steady_clock实际精度通常是 15–25ns,不是所有平台都能稳定到 1ns - 单次测量意义不大,尤其对小函数;建议循环多次取最小值或中位数,避免被调度、缓存预热干扰
release 模式下测出来是 0?编译器把你的代码优化掉了
如果你测的是一个纯计算函数,又没用到返回值,-O2 或更高优化级别下,整个调用可能被编译器整个删掉——你其实是在测“空操作”的耗时。
- 把关键计算结果强制输出到 volatile 变量,例如:
volatile auto result = my_func(); - 或者用
asm volatile("" ::: "memory");插个内存屏障(更重,但可靠) - 用
std::chrono::steady_clock::now()前后各一次,中间夹住你要测的代码块,别让编译器跨过计时点重排
Windows 下高精度计时为什么偶尔卡顿?
Windows 默认 steady_clock 底层用的是 QueryPerformanceCounter,但某些虚拟机、老旧 BIOS 或电源管理策略会导致 QPC 频率漂移,表现为两次 now() 调用间隔异常大。
立即学习“C++免费学习笔记(深入)”;
- 检查是否在 VM 中运行:部分虚拟化环境 QPC 不可靠,可临时 fallback 到
std::chrono::high_resolution_clock(仍需验证行为) - 避免在
SetThreadAffinityMask或SetThreadPriority后立刻计时,线程迁移可能引入额外延迟 - 若发现抖动 >100μs,先用
QueryPerformanceFrequency检查频率是否稳定,再排查硬件/驱动
真正难的不是写对那几行 steady_clock::now(),而是确保被测代码没被优化掉、时钟源没被系统拖累、结果没被自己误读成“性能好”。这些地方一漏,数据就废了。











