c/c++測試執行函式時間的方法
測試函式:
void test()
{
long i; //long型別比int型別表示範圍更大
for (i = 0;i < 1600000000;i++)
{
long a = 0;
a = a + 1;
}
}
在標準C/C++中,最小的計時單位是1毫秒。
第一種方式:
time/difftime
函式原名:time
函式原型:time_t time(time_t *timer) //time_t 實際上就是長整 型long int
函式功能:得到日曆時間
函式返回:返回字串格式
函式名稱: difftime
函式原型: double difftime(time_t time2, time_t time1)
函式功能: 得到兩次機器時間差,單位為秒
函式返回: 時間差,單位為秒
引數說明: time1-機器時間一,time2-機器時間二.該引數應使用time函式獲得
所屬檔案:
void test1()
{
time_t start, stop;
start = time(NULL); //time(NULL);//獲取系統時間,單位為秒
test();
stop = time(NULL);
printf("time is :%f\n",difftime(stop , start ));
}
定義一個time_t變數,讓後把變數的地址傳給它。
time();這個函式其實儲存的是一個歷史時間,函式會返回自1970年1月1日0點走過的秒數,同時把這個返回值儲存在你傳進來的那個time_t*指向的變數裡面。
如果你傳進來NULL的話,就不儲存。所以需要用NULL把這個歷史時間清空一下,time()就會自動儲存當前時間了。你可以簡單的理解為NULL就是給time()初始化。
第二種:
QueryPerformanceFrequency()
型別:Win32API
原型:
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);//Query (詢問)Performance(完成) Frequency(頻率)
作用:返回硬體支援的高精度計數器的頻率。
返回值:非零,硬體支援高精度計數器;零,硬體不支援,讀取失敗。
函式的原形是:
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
QueryPerformanceFrequency
BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);
需包含windows.h標頭檔案。
原理:在定時前應該先呼叫QueryPerformanceFrequency()函式獲得機器內部計時器的時鐘頻率。接著在需要嚴格計時的事件發生前和發生之後分別呼叫QueryPerformanceCounter(),利用兩次獲得的計數之差和時鐘頻率,就可以計算出事件經歷的精確時間。
void test2()
{
LARGE_INTEGER T1, T2, Tc;
QueryPerformanceFrequency(&Tc);
QueryPerformanceCounter(&T1);
test();
QueryPerformanceCounter(&T2);
//列印LONGLONG型別,使用llu%
printf("time: %llu s\n", ((T2.QuadPart - T1.QuadPart)/(Tc.QuadPart)) );
}
資料型別LARGEINTEGER既可以是一個作為8位元組長的整數,也可以是作為兩個4位元組長的整數的聯合結構,其具體用法根據編譯器是否支援64位而定。該型別的定義如下:
typeef union _ LARGE_INTEGER
{
struct
{
DWORD LowPart;
LONG HighPart;
};
LONGLONG QuadPart;
} LARGE_INTEGER;
第三種:
timeGetTime
函式以 毫秒 計的系統時間。該時間為從系統開啟算起所經過的時間。
在SDK中,可以用 DWORD timeGetTime(VOID)函式獲取系統時間,其返回值是毫秒單位的。可以用其實現延時功能的函式。
注意timeGetTime函式是一個雙字。這個值在0到2^32之間。大約49.71天。
**標頭檔案:**Mmsystem.h或Windows.h
檔案頭部新增: #pragma comment( lib,”winmm.lib” )
void test3()
{
DWORD t1, t2;
t1 = timeGetTime();
test();
t2 = timeGetTime();
printf("time is %u s\n",(t2 - t1)/1000);
}
第四種
GetTickCount:
GetTickCount是一種函式。GetTickCount返回(retrieve)從作業系統啟動所經過(elapsed)的毫秒數,它的返回值是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.”。因此,如果是編寫伺服器端程式,此處一定要萬分注意,避免引起意外的狀況(如需避免此種情況可使用Ctime類或者是系統API的SYSTEMTIME進行判斷)。
標頭檔案: Windows.h
void test4()
{
DWORD t1, t2;
t1 = GetTickCount();
test();
t2 = GetTickCount();
printf("time is %u s\n", (t2 - t1)/1000 );
}
第五種:
clock()
clock()是C/C++中的計時函式,而與其相關的資料型別是clock_t。
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
void test5()
{
clock_t t1,t2;
t1 = clock();
test();
t2 = clock();
//CLOCKS_PER_SEC
//是標準c的time.h頭函式中巨集定義的一個常數,用於將clock()函式的結果轉化為以秒為單位的量.
//。VC++6.0中該符號常量定義如下:#define CLOCKS_PER_SEC 1000但是這個量的具體是是與作業系統相關的。
printf("time is %f s\n", ((double)(t2 - t1)/ CLOCKS_PER_SEC) );
}