Windows 計算程序運行時間(高精度計時)


首先,認識一下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的時間精度是很低的!

 

https://blog.csdn.net/hellokandy/article/details/51330028


免責聲明!

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



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