You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C/C++中将RDTSC时钟周期转换为实际时间?

代码存在的问题

  • 指令乱序导致计时不准:rdtsc 指令本身不具备序列化特性,CPU 乱序执行机制可能会调整 rdtsc 和前后其他指令的执行顺序,导致读取到的周期数和实际要计时的代码执行周期不匹配。就算两次 rdtsc 中间没有其他代码,也可能出现读取顺序不符合预期的情况。可以在汇编中添加 lfence 指令保证序列化,修改后的RDTSC函数参考:
static inline uint64_t RDTSC()
{
    unsigned int hi, lo;
    // 先执行lfence保证前面的指令都执行完再读rdtsc
    __asm__ volatile("lfence\nrdtsc" : "=a" (lo), "=d" (hi) : : "memory");
    return ((uint64_t)hi << 32) | lo;
}
  • 频率参数错误概率高:你使用的0.963GHz大概率不是TSC对应的运行频率。现在绝大多数消费级CPU都支持恒定TSC(Constant TSC),TSC的计数频率是固定的CPU基频,和CPU实际运行时的睿频、节能降频频率无关。你不能用当前CPU的实时运行频率或者标称的非基频数值来做换算,需要先读取CPU对应的TSC频率做换算参数。
  • 极端场景精度损失:如果计时的周期差超过2^53,double 类型的精度无法完整覆盖uint64_t的数值范围,会出现精度损失,长时间计时场景建议先做整数运算再转浮点输出。
  • 转换公式本身逻辑是正确的:1GHz频率下1个周期对应1纳秒,周期数除以GHz单位的频率得到纳秒数,再除以1000得到微秒数的逻辑没有错误,你可以用固定的已知时长的代码(比如执行固定次数的nop循环)来验证换算结果是否符合预期。

内容的提问来源于stack exchange,提问作者Sobia Rind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 20:39:04