1. 程式人生 > >C++獲取CPU頻率(轉)

C++獲取CPU頻率(轉)

mov long 內部 tar amp 計數 計算 cnblogs dpa

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); }

轉自:http://blog.csdn.net/kofandlizi/article/details/6253801

C++獲取CPU頻率(轉)