Windows 計算程式已耗用時間(高精度計時)

來源:互聯網
上載者:User

標籤:計數   str   cli   source   常用   常量   view   最小   bsp   

首先,認識一下clock()和GetTickCount():

一、clock()
clock()是C/C++中的計時函數,而與其相關的資料類型是clock_t。在MSDN中,查得對clock函數定義如下:
clock_t clock(void) ;
簡單而言,就是該程式從啟動到函數調用佔用CPU的時間。這個函數返回從“開啟這個程式進程”到“程式中調用clock()函數”時之間的CPU時鐘計時單元(clock tick)數,在MSDN中稱之為掛鐘時間(wal-clock);若掛鐘時間不可取,則返回-1。其中clock_t是用來儲存時間的資料類型。

在time.h檔案中,我們可以找到對它的定義:

[cpp] view plain copy 
  1. #ifndef _CLOCK_T_DEFINED  
  2. typedef long clock_t;  
  3. #define _CLOCK_T_DEFINED  
  4. #endif  

clock_t是一個長整形數。在time.h檔案中,還定義了一個常量CLOCKS_PER_SEC,它用來表示一秒鐘會有多少個時鐘計時單元,其定義如下:
#define CLOCKS_PER_SEC ((clock_t)1000)

可以看到每過千分之一秒(1毫秒),調用clock()函數返回的值就加1。簡單的說就是clock()可以精確到1毫秒。
在linux系統下,CLOCKS_PER_SEC的值可能有所不同,目前使用的linux列印出來的值是1000000,表示的是微秒。這一點需要注意。

 

二、GetTickCount()
GetTickcount函數:它返回從作業系統啟動到當前所經過的毫秒數,它的傳回值是DWORD。常常用來判斷某個方法執行的時間,其函數原型是DWORD GetTickCount(void),傳回值以32位的雙字類型DWORD儲存,因此可以儲存的最大值是(2^32-1) ms約為49.71天,因此若系統已耗用時間超過49.71天時,這個數就會歸0,MSDN中也明確的提到了:"Retrieves the number of milliseconds that have elapsed since the system was started, up to 49.7 days."。因此,如果是編寫伺服器端程式,此處一定要萬分注意,避免引起意外的狀況。
特別注意:這個函數並非即時發送,而是由系統每18ms發送一次,因此其最小精度為18ms。當需要有小於18ms的精度計算時,應使用StopWatch方法進行。

使用clock計算時間差:

 

[cpp] view plain copy 
  1. #include <time.h>    
  2. #include <stdio.h>    
  3. int main()    
  4. {    
  5.     double start,end,cost;    
  6.     start=clock();    
  7.     sleep(1);    
  8.     end=clock();    
  9.     cost=end-start;    
  10.     printf("%f/n",cost);    
  11.     return 0;    
  12. }    

 

使用GetTickCount計算時間差:

[cpp] view plain copy 
  1. #include <iostream>    
  2. #include <windows.h>    
  3. using namespace std;    
  4. int main()    
  5. {    
  6.     double start = GetTickCount();    
  7.     Sleep(1000);    
  8.     double  end=GetTickCount();    
  9.     cout << "GetTickCount:" << end-start << endl;    
  10.         return 0;    
  11. }    

可以得出結論:clock比GetTickCount具有更高的精度,所以如果需要更高精度的時間差,則建議使用clock。在程式耗時統計時,可以使用clock來協助完成時間差的計算。

 

三、如果需要更高的時間精度(比如說伺服器程式的耗時統計),可以在開始計時統計前先調用QueryPerformanceFrequency()函數獲得機器內部計時器的時鐘頻率,接著在需要嚴格計時的事件發生前和發生之後分別調用QueryPerformanceCounter(),利用兩次獲得的計數之差和時鐘頻率,就可以計算出事件經曆的精確時間(精度可以達到微秒層級)。下面是範例程式碼:

 

[cpp] view plain copy 
  1. #include <windows.h>  
  2. #include <iostream>  
  3.   
  4. int main()  
  5. {  
  6.     LARGE_INTEGER timeStart;    //開始時間  
  7.     LARGE_INTEGER timeEnd;      //結束時間  
  8.   
  9.     LARGE_INTEGER frequency;    //計時器頻率  
  10.     QueryPerformanceFrequency(&frequency);  
  11.     double quadpart = (double)frequency.QuadPart;//計時器頻率  
  12.   
  13.     QueryPerformanceCounter(&timeStart);  
  14.     Sleep(1000);//延時一秒  
  15.     QueryPerformanceCounter(&timeEnd);  
  16.   
  17.     //得到兩個時間的耗時  
  18.     double elapsed = (timeEnd.QuadPart - timeStart.QuadPart) / quadpart;  
  19.     std::cout << elapsed << std::endl;//單位為秒,精度為微秒(1000000/cpu主頻)  
  20.   
  21.     system("pause");  
  22.     return 0;  
  23. }  

多運行幾次,可以看到,每次Sleep耗費的時間都不一樣,所以sleep的時間精度是很低的!

 

51330028

Windows 計算程式已耗用時間(高精度計時)

相關文章

聯繫我們

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