在VC++程序里面做计时器可以用CTime,但是这个精度不高,尤其是在时间间隔很短的情况下可能根本没法用。
对于软件测试,可能需要知道精度很高的时间间隔,这个时候最适合用的就是:QueryPerformanceCounter(简称QPC),这是Windows系统提供的API,可信度非常高,QPC可以精确到1微秒(us),所以即使用在很短的时间间隔上也是有价值的。
下面是用C++封装的一段QPC的代码和一个很小的测试用例,当然不用C++封装直接调用QPC也是可以的。
接口规约:
1. 开始(start)
2. 结束(end)
3. 记录用时(getElapsedTime)
所以,封装以后的程序非常简单:开始计时、停止计时、看一下用了多少时间、重新计时,就是这么简单。
//StopWatch.h#includeclass CStopWatch{public: CStopWatch(); void start(); void stop(); double getElapsedTime(); //in sprivate: LARGE_INTEGER m_start; LARGE_INTEGER m_stop; LARGE_INTEGER m_frequency;};//StopWatch.cppCStopWatch::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 void swap(int & a, int & b){ int t = a; a = b; b = t;}//compile : cl StopWatch.ccint 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.
2.