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