QueryPerformanceFrequency使用方法--Windows高精度定時計數


在多核心或多處理器的計算機上。特別是在支持CPU頻率動態調整的計算機上,windows系統下的QueryPerformanceFrequency()獲取HPET (假設存在)的頻率,而QueryPerformanceCounter() 獲取HPET(假設存在高精度事件定時器(High Precision Event Timer))自上電以來時鍾周期數,與CPU頻率無關 。前一個函數 不會由於線程執行所在的CPU不同或CPU的頻率在不同一時候刻的差異而反饋不同的值。系統上電初始化以后便不會改變 。后一個函數的源也是統一的。

這樣便能夠精確計算目標程序,特別是多線程程序的性能。

假設想獲得CPU的默認信息。包括制造商,版本,默認頻率等等。請使用:__cpuid()。假設想獲得當前CPU的實際頻率,請獲取系統當前基頻和倍頻然后計算得到。

           注:可是這和程序詳細的執行環境有關,程序執行的流暢順利就所用的時間就短,程序執行的環境不好,持續時間久非常長。

           故盡管能夠實現高精度定時計數,可是程序的執行時間還是和執行環境有關,無法做到精確測量。

精確獲取時間:

QueryPerformanceFrequency() - 基本介紹

類型:Win32API

原型:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

作用:返回硬件支持的高精度計數器的頻率。

返回值:非零,硬件支持高精度計數器;零。硬件不支持。讀取失敗。

QueryPerformanceFrequency() - 技術特點

供WIN9X使用的高精度定時器:QueryPerformanceFrequency()和QueryPerformanceCounter()。要求計算機從硬件上支持高精度定時器。需包括windows.h頭文件。

函數的原形是:

BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);

數據類型LARGEINTEGER既能夠是一個作為8字節長的整數,也能夠是作為兩個4字節長的整數的聯合結構,其詳細使用方法依據編譯器是否支持64位而定。該類型的定義例如以下:

typeef union _ LARGE_INTEGER

{

struct

{

DWORD LowPart;

LONG HighPart;

};

LONGLONG QuadPart;

} LARGE_INTEGER;


在定時前應該先調用QueryPerformanceFrequency()函數獲得機器內部計時器的時鍾頻率。

接着在須要嚴格計時的事件發生前和發生之后分別調用QueryPerformanceCounter(),利用兩次獲得的計數之差和時鍾頻率。就能夠計算出事件經歷的精確時間。


測試Sleep的精確時間:

#include <stdio.h>

#include <windows.h>

void main()

{

     LARGE_INTEGER nFreq;

     LARGE_INTEGER nBeginTime;

     LARGE_INTEGER nEndTime;

     double time;

 

     QueryPerformanceFrequency(&nFreq);

     QueryPerformanceCounter(&nBeginTime); 

 

     Sleep(1000);

 

     QueryPerformanceCounter(&nEndTime);

     time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart;

 

     printf("%f\n",time);

     Sleep(1000);

system("Pause");

}

結果為

0.999982

1.000088

1.000200

等,所以Sleep的精度還是比較低的。



免責聲明!

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



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