std::chrono::high_resolution_clock 是跨平台测毫秒级运行时间最可靠的方法,因其基于系统最高精度计时器、不受系统时间调整影响,且能准确反映真实耗时。

用 std::chrono 测毫秒级运行时间最可靠
Windows 下用 GetTickCount() 或 clock() 容易出错,Linux 下 clock() 只统计 CPU 时间、不反映真实耗时。C++11 起,std::chrono 是跨平台、高精度、语义清晰的首选。
核心思路是取两次时间点,用 duration_cast 转成需要的单位:
#include <chrono> #include <iostream> <p>auto start = std::chrono::high_resolution_clock::now(); // ... 你的代码 auto end = std::chrono::high_resolution_clock::now(); auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count(); std::cout << "耗时: " << ms << " ms\n";
-
high_resolution_clock在多数平台对应系统最高精度计时器(如 Windows 的 QPC、Linux 的 CLOCK_MONOTONIC) - 别用
system_clock—— 它可能被系统时间调整干扰,不适合测时长 - 如果只要微秒或纳秒,把
milliseconds换成microseconds或nanoseconds即可
避免 clock() 导致的“时间变慢”假象
常见错误是用 clock() 测整体耗时,尤其在多线程或含 I/O 的程序里,结果远小于实际感知时间。
-
clock()返回的是进程累计 CPU 时间,sleep、磁盘读写、等待锁都会被跳过 - 例如:调用
std::this_thread::sleep_for(1000ms)后,clock()可能只增加几毫秒 - 在容器遍历、数值计算等纯 CPU 场景下它还能凑合,但一旦涉及系统调用就不可信
Release 模式下测时间才有意义
Debug 模式开启断言、关闭优化、插入调试桩,测出来的数字和真实性能完全无关。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
立即学习“C++免费学习笔记(深入)”;
- Clang/GCC 加
-O2或-O3;MSVC 选/O2 - 确保测试代码没被编译器整个优化掉——比如计算结果没被使用,整段可能被删。加个
volatile或输出到全局变量防优化 - 单次测量误差大,建议循环多次取平均,但注意缓存预热和 CPU 频率波动影响
跨平台封装一个简易计时器类
重复写四行 chrono 太啰嗦,可以封装成 RAII 类,构造开始计时、析构自动打印:
struct Timer {
using clock = std::chrono::high_resolution_clock;
clock::time_point start_;
Timer() : start_(clock::now()) {}
~Timer() {
auto us = std::chrono::duration_cast<std::chrono::microseconds>(
clock::now() - start_).count();
std::cout << "耗时: " << us << " μs\n";
}
};
// 用法:
{
Timer t;
// 要测的代码
} // 离开作用域自动输出
注意:这个类不能用于高频短时测量(构造/析构本身有开销),也不适合嵌套作用域——会连续触发多次输出。
真正压测或做性能分析时,别依赖手动打点;chrono 是起点,不是终点。采样频率、JIT 预热、CPU 降频、TLB miss 这些因素,光靠一次 now() 相减根本覆盖不到。

















