Windows API一日一練(68)QueryPerformanceCounter函數
精確的時間計時,有時候是非常必要的。比如播放多媒體時視頻與音訊時間同步,還有在測試代碼的效能時,也需要使用到非常精確的時間計時。還有測試硬體的效能時,也需要精確的時間計時。這時就需要使用QueryPerformanceCounter來查詢定時器的計數值,如果硬體裡有定時器,它就會啟動這個定時器,並且不斷擷取定時器的值,這樣的定時器精度,就跟硬體時鐘的晶振一樣精確的。
函數QueryPerformanceCounter和QueryPerformanceFrequency聲明如下:
WINBASEAPI
BOOL
WINAPI
QueryPerformanceCounter(
__out LARGE_INTEGER *lpPerformanceCount
);
WINBASEAPI
BOOL
WINAPI
QueryPerformanceFrequency(
__out LARGE_INTEGER *lpFrequency
);
lpPerformanceCount是返回定時器當前計數值。
QueryPerformanceFrequency是返回定時器的頻率。
調用函數的例子如下:
#001 //精確時鐘查詢。
#002 //蔡軍生 2007/11/08 QQ:9073204 深圳
#003 void TestHighTimer(void)
#004 {
#005 //
#006 LARGE_INTEGER nFreq;
#007 LARGE_INTEGER nLastTime1;
#008 LARGE_INTEGER nLastTime2;
#009
#010 //擷取是否支援精確定時器。
#011 if (QueryPerformanceFrequency(&nFreq))
#012 {
#013 //
#014 const int nBufSize = 256;
#015 TCHAR chBuf[nBufSize];
#016
#017 //顯示定時器的頻率。
#018 wsprintf(chBuf,_T("LastTime=%I64d/r/n"),nFreq);
#019 OutputDebugString(chBuf);
#020
#021 //擷取定時器的值。
#022 QueryPerformanceCounter(&nLastTime1);
#023 wsprintf(chBuf,_T("LastTime=%I64d/r/n"),nLastTime1);
#024 OutputDebugString(chBuf);
#025
#026 Sleep(0);
#027
#028 //擷取定時器的值。
#029 QueryPerformanceCounter(&nLastTime2);
#030 wsprintf(chBuf,_T("LastTime=%I64d/r/n"),nLastTime2);
#031 OutputDebugString(chBuf);
#032
#033
#034 //計算時間是花費多少秒。
#035 float fInterval = nLastTime2.QuadPart - nLastTime1.QuadPart;
#036 swprintf(chBuf,nBufSize,_T("花費:%f/r/n"),fInterval/(float)nFreq.QuadPart);
#037 OutputDebugString(chBuf);
#038 }
#039
#040 }