高精度計時器 -- C++/Windows版


在VC++程序里面做計時器可以用CTime,但是這個精度不高,尤其是在時間間隔很短的情況下可能根本沒法用。

對於軟件測試,可能需要知道精度很高的時間間隔,這個時候最適合用的就是:QueryPerformanceCounter(簡稱QPC),這是Windows系統提供的API,可信度非常高,QPC可以精確到1微秒(us),所以即使用在很短的時間間隔上也是有價值的。

下面是用C++封裝的一段QPC的代碼和一個很小的測試用例,當然不用C++封裝直接調用QPC也是可以的。

接口規約:

  1. 開始(start)

  2. 結束(end)

  3. 記錄用時(getElapsedTime)

所以,封裝以后的程序非常簡單:開始計時、停止計時、看一下用了多少時間、重新計時,就是這么簡單。

//StopWatch.h
#include <Windows.h>
class CStopWatch
{
public:
    CStopWatch();
    void start();
    void stop();
    double getElapsedTime(); //in s
private:
    LARGE_INTEGER m_start;
    LARGE_INTEGER m_stop;
    LARGE_INTEGER m_frequency;
};

//StopWatch.cpp
CStopWatch::CStopWatch()
{
    m_start.QuadPart = 0;
    m_stop.QuadPart = 0;
    QueryPerformanceFrequency(&m_frequency);
}

void CStopWatch::start()
{
    QueryPerformanceCounter(&m_start);
}

void CStopWatch::stop()
{
    QueryPerformanceCounter(&m_stop);
}

double CStopWatch::getElapsedTime()
{
    LARGE_INTEGER time;
    time.QuadPart = m_stop.QuadPart - m_start.QuadPart;
    return (double)time.QuadPart / (double)m_frequency.QuadPart;
}

//test
#include <stdio.h>
void swap(int & a, int & b)
{
    int t = a;
    a = b;
    b = t;
}
//compile : cl StopWatch.cc
int main()
{
    CStopWatch timer;
    timer.start();
    //...
    int a=1, b=2;
    for (unsigned int i = 0; i < 100000000; ++i)
    {
        swap(a, b);
        swap(a, b);
    }
    timer.stop();
    double d = timer.getElapsedTime();
    printf("%fs\n", d);      //1.166879s
}

 

參考資料:

1. [MSDN] Acquiring high-resolution time stamps

2. [MSDN] QueryPerformanceCounter function


免責聲明!

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



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