標籤:計數 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
- #ifndef _CLOCK_T_DEFINED
- typedef long clock_t;
- #define _CLOCK_T_DEFINED
- #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
- #include <time.h>
- #include <stdio.h>
- int main()
- {
- double start,end,cost;
- start=clock();
- sleep(1);
- end=clock();
- cost=end-start;
- printf("%f/n",cost);
- return 0;
- }
使用GetTickCount計算時間差:
[cpp] view plain copy
- #include <iostream>
- #include <windows.h>
- using namespace std;
- int main()
- {
- double start = GetTickCount();
- Sleep(1000);
- double end=GetTickCount();
- cout << "GetTickCount:" << end-start << endl;
- return 0;
- }
可以得出結論:clock比GetTickCount具有更高的精度,所以如果需要更高精度的時間差,則建議使用clock。在程式耗時統計時,可以使用clock來協助完成時間差的計算。
三、如果需要更高的時間精度(比如說伺服器程式的耗時統計),可以在開始計時統計前先調用QueryPerformanceFrequency()函數獲得機器內部計時器的時鐘頻率,接著在需要嚴格計時的事件發生前和發生之後分別調用QueryPerformanceCounter(),利用兩次獲得的計數之差和時鐘頻率,就可以計算出事件經曆的精確時間(精度可以達到微秒層級)。下面是範例程式碼:
[cpp] view plain copy
- #include <windows.h>
- #include <iostream>
-
- int main()
- {
- LARGE_INTEGER timeStart; //開始時間
- LARGE_INTEGER timeEnd; //結束時間
-
- LARGE_INTEGER frequency; //計時器頻率
- QueryPerformanceFrequency(&frequency);
- double quadpart = (double)frequency.QuadPart;//計時器頻率
-
- QueryPerformanceCounter(&timeStart);
- Sleep(1000);//延時一秒
- QueryPerformanceCounter(&timeEnd);
-
- //得到兩個時間的耗時
- double elapsed = (timeEnd.QuadPart - timeStart.QuadPart) / quadpart;
- std::cout << elapsed << std::endl;//單位為秒,精度為微秒(1000000/cpu主頻)
-
- system("pause");
- return 0;
- }
多運行幾次,可以看到,每次Sleep耗費的時間都不一樣,所以sleep的時間精度是很低的!
51330028
Windows 計算程式已耗用時間(高精度計時)