在Windows及Linux下獲取毫秒級運行時間的方法


在Windows下獲取毫秒級運行時間的方法

  1. 頭文件:<Windows.h>
  2. 函數原型:
    /*獲取時鍾頻率,保存在結構LARGE_INTEGER中***/
         WINBASEAPI
         BOOL
         WINAPI
         QueryPerformanceFrequency(
         _Out_ LARGE_INTEGER * lpFrequency
         );
         /*獲取從某個時間點開始的時鍾周期數,保存在結構LARGE_INTEGER中**/
         WINBASEAPI
         BOOL
         WINAPI
         QueryPerformanceFrequency(
         _Out_ LARGE_INTEGER * lpFrequency
         );
  3.  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獲取時鍾周期數。

  4. 方法:

    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;
}
View Code

在Linux下獲取毫秒級運行時間的方法

  1. 頭文件<sys/time.h> 
  2. 函數原型:
    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;
}
View Code

 參考資料:http://www.ibm.com/developerworks/cn/linux/sdk/rt/part1/index.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM