在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 }
參考資料:
