std::chrono::steady_clock 最适合微秒级时间测量,因其单调不回跳且跨平台;high_resolution_clock 虽分辨率高但标准不保证单调,应优先用 steady_clock 并显式指定 microseconds 精度。

用 std::chrono::high_resolution_clock 获取微秒级时间戳
Windows 上的 clock() 和旧式 gettimeofday() 在多数现代 C++ 环境里既不准也不跨平台,std::chrono::high_resolution_clock 是目前最可靠的选择。它底层通常映射到系统高精度计时器(如 Windows 的 QueryPerformanceCounter 或 Linux 的 clock_gettime(CLOCK_MONOTONIC)),能稳定给出纳秒级分辨率(实际精度取决于硬件和 OS,但微秒级完全没问题)。
实操建议:
立即学习 “C++ 免费学习笔记(深入)”;
- 别用
std::chrono::system_clock——它带时区、可能被系统时间调整拖偏,不适合测耗时 - 两次调用
std::chrono::high_resolution_clock::now()之间尽量减少无关操作,避免测量噪声 - 结果转微秒时,用
std::chrono::duration_cast<:chrono::microseconds>(end - start).count()</:chrono::microseconds>,别手算除法
auto start = std::chrono::high_resolution_clock::now(); // your code here auto end = std::chrono::high_resolution_clock::now(); auto us = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
为什么 std::chrono::steady_clock 更适合长时间测量?
high_resolution_clock 虽快,但标准不保证它是单调的(某些旧实现可能回跳);而 steady_clock 明确要求单调、不随系统时间调整而变,更适合测“真实经过时间”。在 clang/gcc 和 MSVC 最新版本中,steady_clock 和 high_resolution_clock 常指向同一实现,但语义更安全。
实操建议:
立即学习 “C++ 免费学习笔记(深入)”;
- 只要不是测“从 epoch 开始多少秒”,一律优先选
std::chrono::steady_clock - 不要假设
high_resolution_clock::is_steady为true——查文档或运行时验证,但不如直接用steady_clock - 若需纳秒级输出,
duration_cast<:chrono::nanoseconds></:chrono::nanoseconds>可行,但注意.count()返回的是long long,超 292 年会溢出(实际几乎不用考虑)
常见错误:循环内反复创建 std::chrono::time_point 导致性能干扰
有人把计时逻辑塞进 tight loop 里,每轮都调 now(),结果发现耗时暴涨——不是代码慢,是计时本身成了瓶颈。高精度时钟读取虽快,但在某些虚拟化环境或老 CPU 上仍需几十到上百纳秒,频繁调用会显著拉高测量值。
实操建议:
立即学习 “C++ 免费学习笔记(深入)”;
- 单次测量:只在关键段前后各一次
now() - 多次测量取平均:把整个被测逻辑包进循环,只在循环外计时,比如跑 1000 次后除以 1000
- 避免在
std::cout、锁、内存分配等开销大的操作附近计时,它们会污染数据
跨平台编译时要注意 std::chrono 的隐式截断问题
Linux 和 macOS 默认用 clock_gettime,返回纳秒级整数;Windows 上 VC++ 用 QueryPerformanceCounter,但早期版本的 steady_clock::time_point::duration 类型可能是 nanoseconds,也可能是 microseconds,导致 duration_cast 后丢精度。
实操建议:
立即学习 “C++ 免费学习笔记(深入)”;
- 显式指定目标精度,比如统一用
microseconds,避免依赖默认duration类型 - 用
auto推导time_point,但别用auto推导duration——容易误推成system_clock::duration等非预期类型 - CI 测试时在不同平台跑下
sizeof(steady_clock::duration::rep)和steady_clock::is_steady,心里有底
微秒级计时本身不难,难的是让每次测量都不被环境反向影响——尤其是你刚改完一行代码就看到耗时波动 5%,大概率不是算法问题,是计时方式暴露了系统噪声。留心那几个 now() 调用的位置,比优化循环体更管用。






























