推荐用std::chrono::steady_clock测单次执行耗时,因其语义明确、单调不回拨;high_resolution_clock虽精度高但标准不保证单调,实际常与steady_clock同实现。

用 std::chrono::high_resolution_clock 测单次执行耗时
直接拿 std::chrono::high_resolution_clock 的 now() 打点,差值转成纳秒或毫秒最常用。注意它返回的是 time_point,不能直接减,得用 duration_cast 转换:
#include <chrono> #include <iostream><p>auto start = std::chrono::high_resolution_clock::now(); // 你的代码块 for (int i = 0; i ... / } auto end = std::chrono::high_resolution_clock::now();</p> <p>auto ns = std::chrono::duration_cast<:chrono::nanoseconds>(end - start).count(); std::cout </:chrono::nanoseconds></p> <ul> <li>别用 <code>clock()</code> 或 <code>std::clock()</code>:它是 CPU 时间,多线程下不准,且分辨率低</li> <li> <code>high_resolution_clock</code> 在多数平台(Linux/macOS/MSVC)底层映射到 <code>CLOCK_MONOTONIC</code> 或 <code>QueryPerformanceCounter</code>,稳定不回拨</li> <li>如果只关心毫秒级,用 <code>std::chrono::milliseconds</code> 而非 <code>nanoseconds</code>,避免整数溢出(尤其长时间运行)</li> </ul> <h3>为什么测出来的时间每次都不一样?</h3> <p>单次测量受系统调度、缓存预热、TLB 命中、CPU 频率动态调整等干扰极大,<code>high_resolution_clock::now()</code> 本身开销虽小(通常几十纳秒),但不足以抵消这些噪声。</p> <ul> <li>必须重复多次取最小值、中位数或平均值——推荐至少 100 次,剔除首尾 10% 异常值</li> <li>每次测量前加 <code>_mm_pause()</code>(x86)或 <code>std::this_thread::yield()</code> 可减少线程抢占干扰(非必需,但实测有效)</li> <li>关闭 CPU Turbo Boost 和电源管理(如 Linux 的 <code>cpupower frequency-set -g performance</code>)能显著降低方差</li> </ul> <h3> <code>steady_clock</code> 和 <code>high_resolution_clock</code> 到底该选哪个?</h3> <p>在几乎所有现代标准库实现中,<code>std::chrono::high_resolution_clock</code> 是 <code>steady_clock</code> 的别名或子集(GCC/Clang/MSVC 均如此),二者都满足单调、不可逆、适合计时的要求。</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>优先写 <code>steady_clock</code>:语义更明确,表示“你只关心流逝时间,不关心墙上时间”</li> <li>写 <code>high_resolution_clock</code> 也没错,但别误以为它“精度更高”——实际精度取决于硬件和 OS,C++ 标准只要求它“尽可能高”,没定义下限</li> <li>绝对不要用 <code>system_clock</code> 测执行时间:它可能因 NTP 同步跳变,导致 <code>end - start</code> 出负数</li> </ul> <h3>跨平台编译时发现 <code>high_resolution_clock</code> 不可用?</h3> <p>不是真的不可用,而是某些旧版本 MinGW(如 GCC 4.9)把 <code>high_resolution_clock</code> 实现为空类型,调用 <code>now()</code> 会链接失败。</p> <ul> <li>检查编译器版本:<code>g++ --version</code>,GCC 5.1+ 已修复</li> <li>临时降级方案:改用 <code>steady_clock</code>,它在所有 C++11 兼容实现中都保证可用</li> <li>若必须用 <code>high_resolution_clock</code> 且无法升级工具链,可加编译期检测:</li> </ul> <pre class="brush:php;toolbar:false;">#if defined(__GNUC__) && __GNUC__ <p>真正难处理的其实是 Windows 上的 <code>QueryPerformanceCounter</code> 频率漂移问题——不过那是标准库实现该操心的事,用户只需确保用的是主流发行版 STL。</p>
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










