C++如何计算代码块执行的Wall Time _ high_resolution_clock【干货】

风杰酱_1106

风杰酱_1106

2026-04-11

881人浏览

原创

c++oding="utf-8" ?>

high_resolution_clock不适合测wall time,因为它不保证单调性,可能受系统时间调整影响而跳变;实际中windows下常退化为system_clock,linux下多alias到steady_clock,macos存在调度抖动。

c++如何计算代码块执行的wall time _ high_resolution_clock【干货】

用 std::chrono::high_resolution_clock 测 Wall Time 是可行的,但必须注意它不保证是单调时钟,且在某些平台(如 Windows + MSVC)可能退化为 steady_clock 或存在微秒级抖动——真要精确测代码块耗时,优先选 steady_clock。

为什么 high_resolution_clock 不适合测 Wall Time?

它名义上“高精度”,但标准只要求它是三个时钟(system_clock、steady_clock、high_resolution_clock)中“分辨率最高”的那个,没规定它必须是单调的。实际中:

  • Linux GCC:常 alias 到 steady_clock(OK)
  • Windows MSVC:常 alias 到 system_clock(受系统时间调整影响,clock_gettime(CLOCK_REALTIME) 级别)
  • macOS Clang:行为依赖 libc++ 实现,有时返回纳秒但有 10–15ms 的调度抖动

也就是说,如果你的代码块执行期间系统时间被 NTP 调整了,high_resolution_clock::now() 可能跳变,导致负值或异常大值。

正确做法:用 steady_clock 测 Wall Time

Wall Time 指的是真实流逝的物理时间,只要求单调、稳定、不受系统时钟修改影响——这正是 steady_clock 的设计目标。它基于硬件计数器(如 TSC、HPET),精度通常达纳秒级,且在所有主流 STL 实现中都可靠。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

实操写法:

#include <chrono>
#include <iostream><p>auto start = std::chrono::steady_clock::now();
// ... your code block ...
auto end = std::chrono::steady_clock::now();</p>
<p>auto duration = end - start;
auto microseconds = std::chrono::duration_cast<:chrono::microseconds>(duration).count();
std::cout </:chrono::microseconds></p>
<ul>
<li>不要用 <code>time_since_epoch()</code> 转成绝对时间再减——多此一举,还可能溢出</li>
<li>避免用 <code>double</code> 转换(如 <code>duration.count() * 1e-6</code>),整数 cast 更快、无浮点误差</li>
<li>若需毫秒/秒级输出,用 <code>milliseconds</code> 或 <code>seconds</code> 替换 <code>microseconds</code> 即可</li>
</ul>
<h3>如何验证你拿到的是真纳秒级 Wall Time?</h3>
<p>光看类型没用,得看实际分辨率。可用以下代码探测:</p>
<pre class="brush:php;toolbar:false;">auto res = std::chrono::steady_clock::period::num 
         / static_cast<double>(std::chrono::steady_clock::period::den);
std::cout <ul>
<li>输出 <code>1e-09</code> 表示理论纳秒级(常见于 Linux x86_64)</li>
<li>输出 <code>1e-07</code> 或更大(如 Windows 上常见 <code>1e-07</code>),说明底层用的是 QueryPerformanceCounter 低频采样,实际抖动可能达 10–15μs</li>
<li>此时别硬凑纳秒输出——用 <code>microseconds</code> cast 更诚实</li>
</ul>
<h3>高频测量时容易踩的坑</h3>
<p>单次测量误差 > 100ns 很常见,尤其在短代码块(</p>
<ul>
<li>编译器可能优化掉空循环或纯计算块(加 <code>volatile</code> 或用 <code>asm volatile("" ::: "memory")</code> 防止)</li>
<li>CPU 频率动态缩放(turbo boost / P-state)会导致同一段代码多次运行时间差异达 2–3×</li>
<li>没做 warmup:第一次调用可能触发 TLB miss、cache miss、分支预测器冷启动</li>
<li>没重复多次取最小值或中位数:单次结果受中断、调度干扰太大</li>
</ul>
<p>简单防干扰建议:循环测 100 次,丢弃首 10 次,取剩余中位数。</p>
<p>真正难的不是调哪个 clock 函数,而是理解 “Wall Time” 在不同负载、不同内核调度策略、不同 CPU 微架构下的物理意义是否一致——哪怕用了 <code>steady_clock</code>,在容器里跑、开了 cgroup 限频、或遇到 SMT 抢占,测出来的“时间”也未必反映纯粹的硬件流逝。</p></double>

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.20

3188

5

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

2025.08.29

4008

10

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

2025.10.23

764

4

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.26

3239

3

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.27

2818

6

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

2023.08.01

1488

3

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2579

5

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.08

3290

4

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

1617

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习