C++獲取CPU頻率(轉)


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM