1. 程式人生 > >C++中兩種常用的記錄程式執行時間的方法的總結

C++中兩種常用的記錄程式執行時間的方法的總結

關於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()函式。