1. 程式人生 > >C/C++_測試函式的執行時間

C/C++_測試函式的執行時間

目前,存在著各種計時函式,它們的計時方式大都是下面這樣的:
計時流程

1.計時函式彙總

方法1,time()包含在< time.h >中,用於獲取當前的系統時間,返回的結果是一個time_t型別,其實就是一個long int型別,其值表示從CUT(Coordinated Universal Time)時間1970年1月1日00:00:00(稱為UNIX系統的Epoch時間)到當前時刻的秒數.

void test1()
{
    time_t start,stop;
    start = time(NULL);
    Do_Something();
    stop = time(NULL);
    printf("Use Time:%ld\n",(stop-start
));
}

方法2,clock()函式,包含在< time.h >中,它返回從“開啟這個程式程序”到“程式中呼叫clock()函式”時之間的CPU時鐘計時單元(clock tick)數,在MSDN中稱之為掛鐘時間(wal-clock)
常量CLOCKS_PER_SEC用來表示一秒鐘會有多少個時鐘計時單元,或者理解為機器時鐘每秒的打點數

void test2()
{
    double result;
    clock_t start,end;
    start = clock();
    Do_Something();
    end = clock();
result = (double)(end - start); printf("Use Time:%f\n",result/CLOCKS_PER_SEC); }

方法3,timeGetTime()函式以毫秒計的系統時間。該時間為從系統開啟算起所經過的時間,是windows API,所以要包含< Windows.h >

void test3()
{
    DWORD t1,t2;
    t1 = timeGetTime();
    Do_Something();
    t2 = timeGetTime();
    printf("Use Time:%f
\n"
,(t2-t1)*1.0/1000); }

方法4,QueryPerformanceCounter()這個函式返回高精確度效能計數器的值,它可以以微妙為單位計時.但是QueryPerformanceCounter()確切的精確計時的最小單位是與系統有關的,所以,必須要查詢系統以得到QueryPerformanceCounter()返回的每秒打點數的頻率.QueryPerformanceFrequency()提供了這個頻率值,返回每秒的打點數.

void test4()
{
    LARGE_INTEGER t1,t2,tc;
    QueryPerformanceFrequency(&tc);
    QueryPerformanceCounter(&t1);
    Do_Something();
    QueryPerformanceCounter(&t2);
    printf("Use Time:%f\n", \
          (t2.QuadPart - t1.QuadPart)*1.0/tc.QuadPart);
}

方法5,GetTickCount返回(retrieve)從作業系統啟動到現在所經過(elapsed)的毫秒數,它的返回值是DWORD,包含在標頭檔案< winbase.h >內。

void test5()
{
    DWORD t1,t2;
    t1 = GetTickCount();
    Do_Something();
    t2 = GetTickCount();
    printf("Use Time:%f\n",(t2-t1)*1.0/1000);
}

方法6,使用Boost庫中的timer
timer類可以測量時間的流逝,是小型計時器,提供毫秒級別的計時精度。需要包含標頭檔案< boost/timer.hpp >和名稱空間boost

#include<boost/timer.hpp>
#include<iosream>
using namespace std;
using namespace boost;

void main()
{
    timer time;
    Do_Something();
    cout<<"now:"<<time.elapsed()<<"s"<<endl;
}

2.測定函式的執行時間

根據類和物件的特點,如果在函式內部建立過物件,那麼在函式執行結束的時候,就會自動呼叫類的解構函式,那麼我們就可以按照這個思路來設計一個僅在DEBUG版本下有效的測定函式執行時間的方法:

思路:設計一個Time類,Time類的建構函式裡面記錄呼叫建構函式的當前時間,Time的解構函式裡面記錄呼叫解構函式的當前時間以及呼叫建構函式的時間和呼叫解構函式時間的時間差。

我們在函式開頭的時候定義一個Time類的物件,在函式結尾的時候,就會自動呼叫Time類的解構函式,這樣我們就可以得到這個函式的執行時間。

虛擬碼:

#ifdef _DEBUG //Debug版本下會定義_DEBUG這個巨集
#define GET_TIME Time t
#else GET_TIME
#endif

class Time
{
    public:
        Time()
        {
            start_time;
        }
        ~Time()
        {
            end_time;
            end_time - start_time;
        }
}
//使用例項
void func()
{
    GET_TIME;
    //code
}

PS:這是作者的腦力勞動成果,轉載請註明出處。