1. 程式人生 > >Windows下精確獲取程式的執行時間可精確到微妙

Windows下精確獲取程式的執行時間可精確到微妙

在Windows下可以用系統提供的API函式 QueryPerformanceFrequency 和 QueryPerformanceCounter 來進行高精度的計時,現在的機器基本上都提供這種高精度的計時啦,所以不用擔心。利用該函式可以精確的計時到微妙級別。msdn的描述見這裡。

QueryPerformanceFrequency() 可以得到CPU的時鐘頻率。

QueryPerformanceCounter() 可以通過兩次的差值來得到CPU的時鐘週期差值。

這樣就可以計算出兩次差值之間所花費的時間,當然這裡計算出來的時間是秒,一般都換算為毫秒或者微妙來表示。

下面我把該函式封裝到了一個類裡面,直接用起來還是比較方便的,程式碼也比較簡單,下面就直接貼程式碼了。

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

//#include <QFile>
//#include <QString>
//#include <QByteArray>

class MyTimer{

private:
    LARGE_INTEGER large_integer;
    __int64 IntStart;
    __int64 IntEnd;
    double DobDff;
    double DobMillseconds;

public:
    MyTimer(){};

    void TimerStart(){
        QueryPerformanceFrequency(&large_integer);
        DobDff = large_integer.QuadPart;

        QueryPerformanceCounter(&large_integer);
        IntStart = large_integer.QuadPart;
    }

    double TimerFinish(){
        QueryPerformanceCounter(&large_integer);
        IntEnd = large_integer.QuadPart;
        DobMillseconds = (IntEnd - IntStart) * 1000 / DobDff; //轉為ms
        return DobMillseconds;
    }
    
    //當然這個可以不要,根據測試需要新增
//    void OutputToFile(QString fileName){
//        QFile file(fileName);
//        if(!file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text))
//            return;
//        QByteArray data = QByteArray("The Timer of millseconds is: ")
//        + QByteArray::number(DobMillseconds) + QByteArray("ms\n");
//        file.write(data);
//        file.close();
//    }

};

int main ()
{
    MyTimer timer;
    timer.TimerStart();
    Sleep(1.321);
    double tm = timer.TimerFinish();
    std::cout << tm << std::endl;
    
//    timer.OutputToFile("C:/timer.txt");
}

類似的結果如下: