在windows平台下擷取精確經過時間

來源:互聯網
上載者:User

原文地址:http://blog.csdn.net/lsmdiao0812/article/details/3173374

 

LARGE_INTEGER tima,timb; 
QueryPerformanceCounter(&tima);

在 Windows Server 2003 和 WindowsXP 中使用 QueryPerformanceCounter 函數的程式可能執行不當

QueryPerformanceCounter 來精確計算執行時間
QueryPerformanceCounter 來精確計算執行時間
// 這個程式展示了如何使用QueryPerformanceCounter 來精確計算執行時間
//代碼

 

  1. LARGE_INTEGER m_liPerfFreq={0};
  2.  //擷取每秒多少CPU Performance Tick
  3.  QueryPerformanceFrequency(&m_liPerfFreq); 
  4.  LARGE_INTEGER m_liPerfStart={0};
  5.  QueryPerformanceCounter(&m_liPerfStart);
  6.  for(int i=0; i< 100; i++)
  7.   cout << i << endl;
  8.  LARGE_INTEGER liPerfNow={0};
  9.  // 計算CPU運行到現在的時間
  10.  QueryPerformanceCounter(&liPerfNow);
  11.  int time=( ((liPerfNow.QuadPart - m_liPerfStart.QuadPart) * 1000)/m_liPerfFreq.QuadPart);
  12.  char buffer[100];
  13.  sprintf(buffer,"執行時間 %d millisecond ",time);
  14.  cout<<buffer<<endl;

QueryPerformanceCounter()這個函數返回高精確度效能計數器的值,它可以以微妙為單位計時.但是QueryPerformanceCounter()確切的精確計時的最小單位是與系統有關的,所以,必須要查詢系統以得到QueryPerformanceCounter()返回的嘀噠聲的頻率.
QueryPerformanceFrequency()提供了這個頻率值,返回每秒嘀噠聲的個數.
計算確切的時間是從第一次調用QueryPerformanceCounter()開始的
假設得到的LARGE_INTEGER為nStartCounter,過一段時間後再次調用該函數結束的,
設得到nStopCounter.
兩者之差除以QueryPerformanceFrequency()的頻率就是開始到結束之間的秒數.由於計時函數本身要耗費很少的時間,要減去一個很少的時間開銷.但一般都把這個開銷忽略.公式如下:   
                         nStopCounter-nStartCounter 
ElapsedTime=------------------------------------ - overhead 
frequency 

double time=(nStopCounter.QuadPart-nStartCounter.QuadPart)/frequency.QuadPart

 

 

這兩個函數是VC提供的僅供Windows 95及其後續版本使用的精確時間函數,並要求電腦從硬體上支援精確定時器。
QueryPerformanceFrequency()函數和QueryPerformanceCounter()函數的原型如下:

       BOOL  QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);       BOOL  QueryPerformanceCounter(LARGE_INTEGER *lpCount);

  資料類型ARGE_INTEGER既可以是一個8位元組長的整型數,也可以是兩個4位元組長的整型數的聯合結構, 其具體用法根據編譯器是否支援64位而定。該類型的定義如下:

       typedef union _LARGE_INTEGER       {           struct           {              DWORD LowPart ;// 4位元組整型數              LONG  HighPart;// 4位元組整型數           };           LONGLONG QuadPart ;// 8位元組整型數                   }LARGE_INTEGER ;

  在進行定時之前,先調用QueryPerformanceFrequency()函數獲得機器內部定時器的時鐘頻率, 然後在需要嚴格定時的事件發生之前和發生之後分別調用QueryPerformanceCounter()函數,利用兩次獲得的計數之差及時鐘頻率,計算出事件經 曆的精確時間。下列代碼實現1ms的精確定時:

 
  1.        LARGE_INTEGER litmp; 
  2.        LONGLONG QPart1,QPart2;
  3.        double dfMinus, dfFreq, dfTim; 
  4.        QueryPerformanceFrequency(&litmp);
  5.        dfFreq = (double)litmp.QuadPart;// 獲得計數器的時鐘頻率
  6.        QueryPerformanceCounter(&litmp);
  7.        QPart1 = litmp.QuadPart;// 獲得初始值
  8.        do
  9.        {
  10.           QueryPerformanceCounter(&litmp);
  11.           QPart2 = litmp.QuadPart;//獲得中止值
  12.           dfMinus = (double)(QPart2-QPart1);
  13.           dfTim = dfMinus / dfFreq;// 獲得對應的時間值,單位為秒
  14.        }while(dfTim<0.001);

  其定時誤差不超過1微秒,精度與CPU等機器配置有關。 下面的程式用來測試函數Sleep(100)的精確期間:

 
  1.        LARGE_INTEGER litmp; 
  2.        LONGLONG QPart1,QPart2;
  3.        double dfMinus, dfFreq, dfTim; 
  4.        QueryPerformanceFrequency(&litmp);
  5.        dfFreq = (double)litmp.QuadPart;// 獲得計數器的時鐘頻率
  6.        QueryPerformanceCounter(&litmp);
  7.        QPart1 = litmp.QuadPart;// 獲得初始值
  8.        Sleep(100);
  9.        QueryPerformanceCounter(&litmp);
  10.        QPart2 = litmp.QuadPart;//獲得中止值
  11.        dfMinus = (double)(QPart2-QPart1);
  12.        dfTim = dfMinus / dfFreq;// 獲得對應的時間值,單位為秒    

  由於Sleep()函數自身的誤差,上述程式每次執行的結果都會有微小誤差。下列代碼實現1微秒的精確定時:

 
  1.        LARGE_INTEGER litmp; 
  2.        LONGLONG QPart1,QPart2;
  3.        double dfMinus, dfFreq, dfTim; 
  4.        QueryPerformanceFrequency(&litmp);
  5.        dfFreq = (double)litmp.QuadPart;// 獲得計數器的時鐘頻率
  6.        QueryPerformanceCounter(&litmp);
  7.        QPart1 = litmp.QuadPart;// 獲得初始值
  8.        do
  9.        {
  10.           QueryPerformanceCounter(&litmp);
  11.           QPart2 = litmp.QuadPart;//獲得中止值
  12.           dfMinus = (double)(QPart2-QPart1);
  13.           dfTim = dfMinus / dfFreq;// 獲得對應的時間值,單位為秒
  14.        }while(dfTim<0.000001);

其定時誤差一般不超過0.5微秒,精度與CPU等機器配置有關。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.