windows效能計時器

來源:互聯網
上載者:User

LARGE_INTEGER
LARGE_INTEGER是union;用於表示一64位有符號整數值.其他定義如下:

View Code

typedef   union   _LARGE_INTEGER   {    
struct {
DWORD LowPart;
LONG HighPart;
};
LONGLONG QuadPart;
} LARGE_INTEGER;

如果你有編譯器直接支援64位整數可以直接使用QuadPart(64位),否則分別對LowPart(32位)和HighPart(32位)存取,HighPart的最高位為符號位。
表示數的範圍:--3689348814741910324到+4611686018427387903 
LARGE_INTEGER的值等4000000000,在記憶體中的布局: 
00   28   6B   EE       00   00   00   00        
   (低位元組   )             (高位元組   )   

QueryPerformanceFrequency()
類型:Win32API
原型:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
作用:返回硬體支援的高精度計數器的頻率。
傳回值:非零,硬體支援高精度計數器;零,硬體不支援,讀取失敗。
QueryPerformanceFrequency() - 技術特點供WIN9X使用的高精度定時器:QueryPerformanceFrequency()和QueryPerformanceCounter(),要求電腦從硬體上支援高精度定時器。
函數的原形是:
  BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
  BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);
資料類型LARGEINTEGER既可以是一個作為8位元組長的整數,也可以是作為兩個4位元組長的整數的聯合結構,其具體用法根據編譯器是否支援64位而定。該類型的定義如下:

View Code

typeef union _ LARGE_INTEGER
  {
     struct
     {
       DWORD LowPart;
       LONG HighPart;
     };
     LONGLONG QuadPart;
} LARGE_INTEGER;

在定時前應該先調用QueryPerformanceFrequency()函數獲得機器內部計時器的時鐘頻率。接著在需要嚴格計時的事件發生前和發生之後分別調用QueryPerformanceCounter(),利用兩次獲得的計數之差和時鐘頻率,就可以計算出事件經曆的精確時間。測試函數SLEEP(100)的精確期間方法:

View Code

  LARGE_INTEGER litmp;
  LONGLONG qt1,qt2;
  double dft,dff,dfm;
  QueryPerformanceFrequency(&litmp);//獲得時鐘頻率
  dff=(double)litmp.QuadPart;
  QueryPerformanceCounter(&litmp);//獲得初始值
  qt1=litmp.QuadPart;Sleep(100);
  QueryPerformanceCounter(&litmp);//獲得終止值
  qt2=litmp.QuadPart;
  dfm=(double)(qt2-qt1);
  dft=dfm/dff;//獲得對應的時間值

需要注意的是DFT計算的結果單位是秒。

【參考資料 感謝作者】
http://www.cnblogs.com/whiteyun/archive/2009/09/17/1568240.html
http://www.cppblog.com/deane/articles/113151.html 

補充:上面所說的內容我的理解是只能用來做計時器,不能用來做定時器。(計時器和定時器有區別吧?)
另外我查閱到資料,有GetSystemTimeAsFileTime()和clock(),這兩者都是擷取現有時間來計時的,故不是很精準,和sleep一樣的效果。請看下面

View Code

#include <stdio.h>
#include <Windows.h>
#include <time.h>

int main(int argc, char* argv[])
{
FILETIME beg,end;
GetSystemTimeAsFileTime(&beg);
Sleep(2000);
GetSystemTimeAsFileTime(&end);

clock_t cbeg,cend;
cbeg=clock();
Sleep(2000);
cend=clock();

LARGE_INTEGER start;
LARGE_INTEGER endt ;
LARGE_INTEGER frequency;
if (!QueryPerformanceFrequency(&frequency))
{
return -1;
}
QueryPerformanceCounter(&start);
Sleep(2000);
QueryPerformanceCounter(&endt);

printf("%d ns\n",100*(end.dwLowDateTime-beg.dwLowDateTime));
printf("%d ms\n",cend-cbeg);
printf("main cost:%f\n", (double)(endt.QuadPart - start.QuadPart) / (double)frequency.QuadPart);
return 0;
}

運行結果為:

LARGE_INTEGER在運行過程中的值:(請注意成員的值)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.