有的時候,想要獲得線程執行一個任務的所花費的時間,你可以使用GetTickCount()(32位Windows環境,不包括Windows Vista)或者GetTickCount64()(Windows Vista環境)函數來獲得當前的時間。兩次執行該函數,並作差運算即可。但是這需要線上程不被打斷的情況下才是有效。
可以使用GetThreadTimes函數來獲得一個線程的已耗用時間。
BOOL GetThreadTimes(
HANDLE hThread,
PFILETIME pftCreationTime,
PFILETIME pftExitTime,
PFILETIME pftKernelTime,
PFILETIME pftUserTime);
該函數取得指定線程的4個時間:
1、建立時間:絕對數值,單位100ns,指明線程建立的時間
2、退出時間:絕對數值,單位100ns,指明線程退出的時間
3、核心程式的時間:相對數值,單位100ns,指明線程運行作業系統代碼花費的時間
4、使用者時間:相對數值,單位100ns,指明線程運行使用者代碼花費的時間
可以如下使用該函數:
GetThreadTimes(GetCurrentThread(), &ftDummy, &ftDummy,
&ftKernelTimeStart, &ftUserTimeStart); //取得開始時間
//這裡可以執行特定的任務和演算法
GetThreadTimes(GetCurrentThread(), &ftDummy, &ftDummy,
&ftKernelTimeEnd, &ftUserTimeEnd); //取得結束時間
上面的代碼兩次呼叫GetThreadTimes函數獲得當前線程啟動並執行時間,只要將“核心程式的時間”和“使用者時間”的參數由FILETIME類型轉換為ULONGLNOG類型,然後作差運算即可。
也可以取得一個“進程”啟動並執行相關時間。
BOOL GetProcessTimes(
HANDLE hProcess,
PFILETIME pftCreationTime,
PFILETIME pftExitTime,
PFILETIME pftKernelTime,
PFILETIME pftUserTime);
該函數個參數的意義同GetThreadTimes函數。該函數返回一個進程中所有線程花費的時間,比如所有線程運行核心代碼所花費的時間的總和。
上面兩個函數對於高精度的需求來說並不是很好。為了得到高精度的時間統計資訊,你可以使用下面兩個函數:
BOOL QueryPerformanceFrequency(LARGE_INTEGER* pliFrequency);
BOOL QueryPerformanceCounter(LARGE_INTEGER* pliCount);
本書中,作者用了一個類把這兩個函數封裝在了裡面,這裡,我提供一般的方法:
LARGE_INTEGER liPerfFreq; // Counts per second(每秒計數)
LARGE_INTEGER liPerfStart; // Starting count(開始時候的計數)
LARGE_INTEGER liPerfNow; // Now count(結束時候的計數)
QueryPerformanceFrequency(&liPerfFreq); // 取得計數頻率
QueryPerformanceCounter(&liPerfStart); // 取得開始時候的計數
// 這裡執行特定的任務和演算法
QueryPerformanceCounter(&liPerfNow); // 取得結束時候的計數
//得到的毫秒數為:
(liPerfNow.QuadPart - liPerfStart.QuadPart) * 1000 / m_liPerfFreq.QuadPart;
//得到微秒數為:
(liPerfNow.QuadPart-liPerfStart.QuadPart)*1000000 / m_liPerfFreq.QuadPart;