C++中兩種常用的記錄程式執行時間的方法的總結
阿新 • • 發佈:2019-02-07
關於C++中計算時間的一些總結
方法一: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檔案中,我們可以找到對clock_t()的定義:
<span style="font-size:14px;">#ifndef _CLOCK_T_DEFINED
typedef long clock_t;
#define _CLOCK_T_DEFINED
#endif</span>
很明顯,clock_t是一個長整形數。在time.h檔案中,還定義了一個常量CLOCKS_PER_SEC,它用來表示一秒鐘會有多少個時鐘計時單元,其定義如下:
#define CLOCKS_PER_SEC ((clock_t)1000)
測試程式:
<span style="font-size:14px;"><span style="font-size:18px;">#include<iostream> #include<time.h> using namespace std; int main() { clock_t startTime,endTime; startTime = clock(); for (int i = 0; i < 1000000; i++) { i++; } endTime = clock(); cout << "Totle Time : " <<(double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl; system("pause"); return 0; }</span></span>
<span style="font-size:14px;">#include<iostream> #include<time.h> using namespace std; int main() { for (int i = 0; i < 1000000; i++) { i++; } cout << "Totle Time : " << (double)clock() /CLOCKS_PER_SEC<< "s" << endl; system("pause"); return 0; }</span>
方法二:GetTickCount()函式:
GetTickCount是函式。GetTickCount返回(retrieve)從作業系統啟動所經過(elapsed)的毫秒數,它的返回值是DWORD。 函式原型: DWORD GetTickCount(void);標頭檔案: C/C++標頭檔案:winbase.h
windows程式設計中可以使用標頭檔案windows.h
測試程式碼:
<span style="font-size:14px;">#include<iostream>
#include<Windows.h>
using namespace std;
int main()
{
DWORD start_time = GetTickCount();
for (int i = 0; i < 100000000; i++)
{
i++;
}
DWORD end_time = GetTickCount();
cout << "The run time is:" << (end_time - start_time) << "ms!" << endl;
system("pause");
return 0;
}</span>
注意事項:
GetTickcount函式:它返回從作業系統啟動到當前所經過的毫秒數,常常用來判斷某個方法執行的時間,其函式原型是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()函式計算執行時間,表示範圍一定大於GetTickCount()函式,所以,建議使用clock()函式。