如何获得CPU的主频 c/c++

参考了网上的代码,增加了自己的一点点注释,希望大家会有收获。

 

LONGLONG GetFrequency(DWORD sleepTime) //获取CPU主频

{

 

DWORD low1 = 0, high1 = 0, low2 = 0, high2 = 0;

 

LARGE_INTEGER fq,st,ed;

/*在定时前应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。接着在

需要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter(),利用两次获得的技术

之差和时钟的频率,就可以计算出时间经历的精确时间。*/

::QueryPerformanceFrequency(&fq); //精确计时(返回硬件支持的高精度计数器的频率)

::QueryPerformanceCounter(&st); //获得起始时间

__asm{ //获得当前CPU的时间数

rdtsc

mov low1, eax

mov high1, edx

}

::Sleep(sleepTime); //将线程挂起片刻

::QueryPerformanceCounter(&ed); //获得结束时间

__asm{

rdtsc //读取CPU的时间戳计数器

mov low2, eax

mov high2, edx

}

 

 

//将CPU得时间周期数转化成64位整数

LONGLONG begin = (LONGLONG)high1<<32 | low1;

LONGLONG end = (LONGLONG)high2<<32 | low2;

//将两次获得的CPU时间周期数除以间隔时间,即得到CPU的频率

//由于windows的Sleep函数有大约15毫秒的误差,故以windows的精确计时为准

return (end - begin)*fq.QuadPart/(ed.QuadPart-st.QuadPart);

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值