天天看點

c語言程式計算函數運作時間,c計算程式運作時間的函數,怎麼才能精确到微妙級呢? 愛問知識人...

1 需要取得系統精确時鐘函數:

1)對于一般的實時控制,使用GetTickCount()函數就可以滿足精度要求,但要進一步提高計時精度,就要采用 QueryPerformanceFrequency()函數和QueryPerformanceCounter()函數。

2)這兩個函數是VC提供的僅供 Windows 9X使用的高精度時間函數,并要求計算機從硬體上支援高精度計時器。

3) QueryPerformanceFrequency()函數和 QueryPerformanceCounter()函數的原型為:

BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

BOOL QueryPerformanceCounter(LARGE_INTEGER *lpCount);

資料類型LARGE—INTEGER既可以是一個作為8位元組長的整型數,也可以是作為兩個4位元組長的整型數的聯合結構,其具體用法根據編譯器是否支援64位而定。

該類型的定義如下:

typedef union _LARGE_INTEGER

{

struct

{

DWORD LowPart; // 4位元組整型數

LONG HighPart; // 4位元組整型數

};

LONGLONG QuadPart;

// 8位元組整型數

} LARGE_INTEGER;

4)在進行計時之前,應該先調用QueryPerformanceFrequency()函數獲得機器内部計時器的時鐘頻率。

筆者在三種PentiumⅡ機器上使用該函數,得到的時鐘頻率都是1193180Hz。接着,筆者在需要嚴格計時的事件發生之前和發生之後分别調用QueryPerformanceCounter()函數,利用兩次獲得的計數之差和時鐘頻率,就可以計算出事件經曆的精确時間。

以下程式是用來測試函數Sleep(100)的精确持續時間。

LARGE—INTEGER litmp;

LONGLONG QPart1,QPart2;

double dfMinus, dfFreq, dfTim;

QueryPerformanceFrequency(&litmp);

// 獲得計數器的時鐘頻率

dfFreq = (double)litmp。

QuadPart;

QueryPerformanceCounter(&litmp);

// 獲得初始值

QPart1 = litmp。QuadPart;

Sleep(100) ;

QueryPerformanceCounter(&litmp);

// 獲得終止值

QPart2 = litmp。

QuadPart;

dfMinus = (double)(QPart2 - QPart1);

dfTim = dfMinus / dfFreq;

// 獲得對應的時間值

執行上面程式,得到的結果為dfTim=0。

097143767076216(秒)。細心的讀者會發現,每次執行的結果都不一樣,存在一定的差别,這是由于Sleep()自身的誤差所緻。

全部