C++一種高精度計時器

在windows下能夠經過QueryPerformanceFrequency()和QueryPerformanceCounter()等系列函數來實現計時器的功能。ios

根據其函數說明,其精度可以達到微秒級,可是須要硬件中的計時器來支持。至於具體怎麼樣的硬件可以支持,查了不少資料都沒有詳細說明;而另一些資料也說明,若是底層硬件不支持,這兩個API就會返回相似於GetTickCount()的精度結果。通常狀況下能夠放心的使用。windows

這裏就把本身一直用的計時器分享一下,已經簡單將其封裝成類的形式,你們能夠將其加入到經常使用的工具組件裏面,方便使用:函數

#include<iostream>
#include<Windows.h>

using namespace std;

class CTimer
{
public:
    CTimer(void);
    ~CTimer(void);

    int time_in();
    double time_out();

private:
    LARGE_INTEGER litmp;
    LONGLONG qt1, qt2;
    double dft, dff, dfm;
};

CTimer::CTimer(void)
{
}


CTimer::~CTimer(void)
{
}

int CTimer::time_in()
{
    QueryPerformanceFrequency(&litmp);//得到時鐘頻率
    dff = (double)litmp.QuadPart;

    QueryPerformanceCounter(&litmp);//得到初始值
    qt1 = litmp.QuadPart;

    return 1;
}

double CTimer::time_out()
{
    QueryPerformanceCounter(&litmp);//得到終止值
    qt2 = litmp.QuadPart;

    dfm = (double)(qt2 - qt1);
    dft = dfm / dff;//得到對應的時間值

    return dft;
}

int main()
{   
    CTimer timer;
    timer.time_in();
    for (size_t i = 0; i < 10000; i++)
    {
        const size_t num = 200 * 1024;
        char *tmp = new char[num];
        memset(tmp, 0, num);
        delete[] tmp;
        tmp = nullptr;
    }
    cout<<"申請堆耗時:"<<timer.time_out()<<endl;

    timer.time_in();
    for (size_t i = 0; i < 10000; i++)
    {
        const size_t num = 200 * 1024;
        char tmp[num];
        memset(tmp, 0, num);
    }
    cout << "申請棧耗時:" << timer.time_out() << endl;
    
    return 0;
}

這裏的例子分別計算了申請堆和申請棧的時間,其運行結果以下:
圖1工具

相關文章
相關標籤/搜索