Windows下精確獲取程式的執行時間可精確到微妙
阿新 • • 發佈:2019-01-22
在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"); }
類似的結果如下: