RDTSC指令介绍与使用

一、了解RDTSC指令

rdtsc指令, 该指令返回CPU自启动以来的时钟周期数;该时钟周期数,即处理器的时间戳。

在CPU通电启动后,首先会重置EDX和EAX,在每个时钟周期上升或下降沿到来时,会自动累计周期数,并被记录到EDX和EAX寄存器中,EDX是高位,EAX是低位。

rdtsc指令就是从该寄存器中进行获取的。

周期和频率的关系公式:T(周期)=1/f(频率)

如CPU频率f为1GHz,则其时钟周期T=1/1GHz秒,意味着每隔T秒,CPU完成一个最基本的动作,并在寄存器中,对周期数加1。

故,假设当前时钟周期数为m,则可计算出CPU自启动后,累计运行时间X=m*T,整理下:

X=m/f

时钟周期与时钟频率互为倒数, 我们可以找出以下关系:

时钟频率时钟周期
1Hz1s
1KHz1ms
1MHz1μs
1GHz1ns

注意计算时,单位要搭配好,比如:

  • f为Hz时,计算得到的X为秒;
  • f为GHz时,计算得到的X为纳秒。

小结

CPU累计运行时间=时钟周期数/CPU频率

二、RDTSC指令在win和linux上的实现

我们已经知道RDTSC可以获取CPU运行时间,另外win平台上也已经有了一个类似的函数:

DWORD GetTickCount()

该函数返回值是系统启动后经过的毫秒数,最长为49.7天。

其微软帮助为:

https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-gettickcount

win和linux下RDTSC的实现

#include <stdint.h>

//  rdtsc
#if _WIN32

#include <intrin.h>
uint64_t rdtsc()  // win
{
    return __rdtsc();
}

#else

uint64_t rdtsc() // linux
{
    unsigned int lo, hi;
    __asm__ volatile ("rdtsc" : "=a" (lo), "=d" (hi));
    return ((uint64_t)hi << 32) | lo;
}

#endif

win下,__rdtsc()函数的微软帮助为:

https://docs.microsoft.com/zh-cn/cpp/intrinsics/rdtsc?view=vs-2019

linux下,则需要内联汇编来实现。

RDTSC指令结合CPU频率,也可以用来计算代码段的执行时间。

参考链接:

《RDTSC指令的使用以及相关问题》



若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!

同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。

在这里插入图片描述

  • 8
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百里杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值