C++如何计算代码块执行的CPU周期 _ rdtsc指令用法【进阶】

风萱君_2184

风萱君_2184

2026-04-08

740人浏览

原创

不能。rdtsc返回的是TSC计数值而非真实CPU周期数,受频率缩放、多核不同步、虚拟化等影响;需配对使用、加cpuid序列化、检查constant_tsc标志并锁定CPU频率才能提升可靠性。

c++如何计算代码块执行的cpu周期 _ rdtsc指令用法【进阶】

rdtsc 指令能直接返回 CPU 周期数吗?

不能。rdtsc 返回的是自上电以来的时间戳计数器(TSC)值,单位是“内部时钟周期”,但现代 CPU 存在多种干扰因素:频率动态缩放(如 Intel SpeedStep、AMD Cool'n'Quiet)、多核 TSC 不同步(老平台)、虚拟化拦截、以及 TSC 本身可能被配置为恒定速率(constant_tsc)或非恒定。因此,裸用 rdtsc 得到的差值 ≠ 实际消耗的 CPU 核心周期数,尤其在笔记本、云服务器或启用了节能策略的系统上误差极大。

  • rdtsc 在 x86-64 下返回一个 64 位值,低 32 位存入 eax,高 32 位存入 edx
  • 必须配对使用:两次 rdtsc 相减才表示区间内 TSC 增量
  • 单次调用无意义;不加序列化指令(如 lfence 或 cpuid)会导致编译器/CPU 乱序执行,测量范围不可控

如何让 rdtsc 测量更可靠?

核心是「防止乱序 + 锁定频率 + 验证 TSC 特性」。这不是加两行汇编就能搞定的事:

  • 在 rdtsc 前后各插一条 cpuid(或 lfence),强制串行化指令流,确保测量边界准确
  • 编译时禁用优化干扰:用 volatile 读取变量,或 asm volatile ("" ::: "rax", "rbx", "rcx", "rdx") 做编译器屏障
  • 运行前检查 CPU 是否支持 constant_tsc 和 nonstop_tsc(Linux 下看 /proc/cpuinfo 的 flags 字段;Windows 可用 __cpuid 查询)
  • 若需接近“真实周期”,应关闭 CPU 频率调节:Linux 上设 scaling_governor=performance,并绑定到单个物理核(避免迁移导致 TSC 跳变)
  • 示例片段(GCC 内联汇编):
    uint64_t rdtsc() {
      uint32_t lo, hi;
      __asm__ volatile ("cpuid\n\t"
                        "rdtsc\n\t"
                        "cpuid\n\t"
                        : "=a"(lo), "=d"(hi)
                        :
                        : "rbx", "rcx");
      return ((uint64_t)hi 

rdtsc 和 std::chrono::high_resolution_clock 哪个更适合性能分析?

std::chrono::high_resolution_clock 是更安全、可移植的选择,但它测的是挂钟时间(wall-clock),不是 CPU 周期。两者用途根本不同:

  • rdtsc(配合正确防护)适合极短代码块(几十到几百纳秒级)的相对性能对比,比如比较两条 SIMD 指令路径、cache line 对齐影响等
  • std::chrono::high_resolution_clock 底层通常映射到 clock_gettime(CLOCK_MONOTONIC),受系统调度、中断、上下文切换影响,但结果稳定、跨平台、无需特权,适合函数级或模块级耗时统计
  • 如果你真正想算“CPU 周期”,现代方案其实是用 perf_event_open(Linux)或 QueryThreadCycleTime(Windows)——它们由内核保障精度,并自动处理频率缩放补偿
  • rdtsc 在容器、VM 中大概率被虚拟化层截获并模拟,返回值失去物理意义;而 perf 事件仍可工作(取决于 hypervisor 支持)

为什么你的 rdtsc 差值每次运行都不一样?

这不是 bug,而是现代 CPU 架构的必然表现:

  • L1/L2 cache 命中率变化 → 数据局部性影响指令执行延迟

  • 分支预测器状态不同 → misprediction 导致流水线冲刷

  • TLB miss / page fault → 触发内存管理开销

    C++14
    C++14

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

    下载
  • 其他逻辑核抢占共享资源(如环形总线、内存控制器)

  • 即使绑核+关降频,单次 rdtsc 测量仍存在 ±10–50 cycle 的抖动;必须重复多次(如 1000+ 次),取中位数或剔除离群值

  • 不要只跑一次就下结论;建议用 std::vector 记录 N 次结果,用 std::nth_element 取中位数

  • 注意 rdtsc 自身也有开销(约 20–40 cycles),若被测代码本身极短(rdtscp(带序列化语义)或改用硬件 PMU 事件(如 UOPS_EXECUTED.CORE)

TSC 值本身不等于 CPU 周期,它只是个高精度计数器;把差值当作“cycles”用,前提是清楚知道当前 CPU 的 TSC 行为、系统配置和测量上下文——漏掉其中任何一环,数字看起来再精确,也是误导。

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

相关专题

更多
c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

2025.10.23

834

12

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

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

2023.07.26

3419

3

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

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

2023.07.27

2958

6

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

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

2023.08.01

1528

3

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

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

2023.08.02

2699

5

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

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

2023.08.08

3350

4

windows自动更新
windows自动更新

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

2023.08.10

1697

3

windows boot manager
windows boot manager

windows boot manager无法开机的解决方法:1、系统文件损坏,使用Windows安装光盘或USB启动盘进入恢复环境,选择修复计算机,然后选择自动修复;2、引导顺序错误,进入恢复环境,选择命令提示符,输入命令"bootrec /fixboot"和"bootrec /fixmbr",然后重新启动计算机;3、硬件问题,使用硬盘检测工具进行扫描和修复;4、重装操作系统。本专题还提供其他解决

2023.08.28

2537

4

windows锁屏快捷键
windows锁屏快捷键

windows锁屏快捷键是Windows键+L、Ctrl+Alt+Del、Windows键+D、Windows键+P和Windows键+R。本专题为大家提供windows相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.30

5327

5

热门下载

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

精品课程

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

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

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

共0课时 | 0人学习