1. 程式人生 > >c/c++測試執行函式時間的方法

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) );
}

這裡寫圖片描述