在Windows下獲取毫秒級運行時間的方法
- 頭文件:<Windows.h>
- 函數原型:
/*獲取時鍾頻率,保存在結構LARGE_INTEGER中***/ WINBASEAPI BOOL WINAPI QueryPerformanceFrequency( _Out_ LARGE_INTEGER * lpFrequency ); /*獲取從某個時間點開始的時鍾周期數,保存在結構LARGE_INTEGER中**/ WINBASEAPI BOOL WINAPI QueryPerformanceFrequency( _Out_ LARGE_INTEGER * lpFrequency );
- LARGE_INTEGER結構
typedef union _LARGE_INTEGER { struct { DWORD LowPart; LONG HighPart; } DUMMYSTRUCTNAME; struct { DWORD LowPart; LONG HighPart; } u; #endif //MIDL_PASS LONGLONG QuadPart; } LARGE_INTEGER;
LARGE_INTEGER為一個union,我們將使用成員QuadPart獲取時鍾周期數。
- 方法:
1) 調用QueryPerformanceFrequency()獲取時鍾頻率
2) 在待測部分的首尾分別調用QueryPerformanceCounter()獲取兩個時間點的時鍾周期數
3) 將兩個節點的時鍾周期數差值除以時鍾頻率即可得到測試部分的運行時間
參考代碼:

#include <iostream> #include <ctime> #include <cstdlib> #include <Windows.h> #define SIZE 100 using namespace std; int a[SIZE]; int b[SIZE]; int c[SIZE]; int main(){ //srand(time(0)); for (int i = 0; i < SIZE; ++i){ a[i] = rand(); b[i] = rand(); } LARGE_INTEGER begain, end, frequency; QueryPerformanceFrequency(&frequency); QueryPerformanceCounter(&begain); #pragma omp parallel for for (int i = 0; i < SIZE; ++i){ c[i] = a[i] * b[i]; } QueryPerformanceCounter(&end); cout << "Cost time : " << (double)(end.QuadPart - begain.QuadPart) * 1000 / frequency.QuadPart << "ms" << endl; cout << begain.QuadPart << endl; }
在Linux下獲取毫秒級運行時間的方法
- 頭文件<sys/time.h>
- 函數原型:
int gettimeofday(struct timeval *tv, struct timezone *tz); struct timeval { time_t tv_sec; /* seconds */ suseconds_t tv_usec; /* microseconds */ };
參考代碼:

#include <stdio.h> #include <stdlib.h> #include <sys/time.h> int main() { struct timeval _tstart, _tend; double t1, t2; gettimeofday(&_tstart, NULL); // ToDo.. gettimeofday(&_tend, NULL); t1 = (double)_tstart.tv_sec * 1000 + (double)_tstart.tv_usec / 1000; t2 = (double)_tend.tv_sec * 1000 + (double)_tend.tv_usec / 1000; printf("Cost time : %fms\n", t2 - t1); return 0; }
參考資料:http://www.ibm.com/developerworks/cn/linux/sdk/rt/part1/index.html