首先,認識一下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文件中,我們可以找到對它的定義:
- #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計算時間差:
- #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計算時間差:
- #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(),利用兩次獲得的計數之差和時鍾頻率,就可以計算出事件經歷的精確時間(精度可以達到微秒級別)。下面是示例代碼:
- #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的時間精度是很低的!
https://blog.csdn.net/hellokandy/article/details/51330028