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<:chrono::milliseconds>(end - start).count();
std::cout </:chrono::milliseconds></p>
<ul>
<li>
<code>high_resolution_clock</code> 在多数平台对应系统最高精度计时器(如 Windows 的 QPC、Linux 的 CLOCK_MONOTONIC)</li>
<li>别用 <code>system_clock</code> —— 它可能被系统时间调整干扰,不适合测时长</li>
<li>如果只要微秒或纳秒,把 <code>milliseconds</code> 换成 <code>microseconds</code> 或 <code>nanoseconds</code> 即可</li>
</ul>
<h3>避免 <code>clock()</code> 导致的“时间变慢”假象</h3>
<p>常见错误是用 <code>clock()</code> 测整体耗时,尤其在多线程或含 I/O 的程序里,结果远小于实际感知时间。</p>
<ul>
<li>
<code>clock()</code> 返回的是进程累计 CPU 时间,sleep、磁盘读写、等待锁都会被跳过</li>
<li>例如:调用 <code>std::this_thread::sleep_for(1000ms)</code> 后,<code>clock()</code> 可能只增加几毫秒</li>
<li>在容器遍历、数值计算等纯 CPU 场景下它还能凑合,但一旦涉及系统调用就不可信</li>
</ul>
<h3>Release 模式下测时间才有意义</h3>
<p>Debug 模式开启断言、关闭优化、插入调试桩,测出来的数字和真实性能完全无关。</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master"><img
src="https://img.php.cn/upload/skill/000/000/081/179051228971575.jpg" alt="C++ Code Review Master" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="overflowclass">C++ Code Review Master</a>
<p class="overflowclass">组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。</p>
</div>
<a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
<ul>
<li>Clang/GCC 加 <code>-O2</code> 或 <code>-O3</code>;MSVC 选 <code>/O2</code>
</li>
<li>确保测试代码没被编译器整个优化掉——比如计算结果没被使用,整段可能被删。加个 <code>volatile</code> 或输出到全局变量防优化</li>
<li>单次测量误差大,建议循环多次取平均,但注意缓存预热和 CPU 频率波动影响</li>
</ul>
<h3>跨平台封装一个简易计时器类</h3>
<p>重复写四行 <code>chrono</code> 太啰嗦,可以封装成 RAII 类,构造开始计时、析构自动打印:</p>
<pre class="brush:php;toolbar:false;">struct Timer {
using clock = std::chrono::high_resolution_clock;
clock::time_point start_;
Timer() : start_(clock::now()) {}
~Timer() {
auto us = std::chrono::duration_cast<:chrono::microseconds>(
clock::now() - start_).count();
std::cout <p>注意:这个类不能用于高频短时测量(构造/析构本身有开销),也不适合嵌套作用域——会连续触发多次输出。</p>
<p>真正压测或做性能分析时,别依赖手动打点;<code>chrono</code> 是起点,不是终点。采样频率、JIT 预热、CPU 降频、TLB miss 这些因素,光靠一次 <code>now()</code> 相减根本覆盖不到。</p></:chrono::microseconds>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










