1)类的实现
#ifndef CPRECISETIMER_H
#define CPRECISETIMER_H#include <windows.h>class CPreciseTimer
{
public:CPreciseTimer();bool SupportsHighResCounter();void StartTimer();void StopTimer();__int64 GetTime();private://Auxiliary Functionvoid UpdateElapsed();//Member variablesbool m_bRunning;__int64 m_i64Start;__int64 m_i64Elapsed;//Some auxiliary variables__int64 m_i64Counts;LARGE_INTEGER m_liCount;//Static Variablesstatic bool sm_bInit;static bool sm_bPerformanceCounter;static __int64 sm_i64Freq;
};inline bool CPreciseTimer::SupportsHighResCounter()
{return sm_bPerformanceCounter;
}//Auxiliary Function
inline void CPreciseTimer::UpdateElapsed()
{if(true == sm_bPerformanceCounter){QueryPerformanceCounter(&m_liCount);m_i64Counts = ((__int64)m_liCount.HighPart << 32) + (__int64)m_liCount.LowPart;//Transform in microseconds(m_i64Counts *= 1000000) /= sm_i64Freq;}else//Transform milliseconds to microsecondsm_i64Counts = (__int64)GetTickCount() * 1000;if(m_i64Counts > m_i64Start)m_i64Elapsed = m_i64Counts - m_i64Start;else//Eliminate possible number overflow (0x7fffffffffffffff is the maximal __int64 positive number)m_i64Elapsed = (0x7fffffffffffffff - m_i64Start) + m_i64Counts;
}#endif // CPRECISETIMER_H
#include "cprecisetimer.h"bool CPreciseTimer::sm_bInit = false;
bool CPreciseTimer::sm_bPerformanceCounter;
__int64 CPreciseTimer::sm_i64Freq;//CONSTRUCTOR
CPreciseTimer::CPreciseTimer() : m_i64Start(0), m_i64Elapsed(0), m_bRunning(false)
{//Only if not already initializedif(false == sm_bInit){//Initializing some static variables dependent on the system just onceLARGE_INTEGER liFreq;if(TRUE == QueryPerformanceFrequency(&liFreq)){//Only if the system is supporting High Performancesm_i64Freq = ((__int64)liFreq.HighPart << 32) + (__int64)liFreq.LowPart;sm_bPerformanceCounter = true;}elsesm_bPerformanceCounter = false;sm_bInit = true;}
}void CPreciseTimer::StartTimer()
{if(true == sm_bPerformanceCounter){QueryPerformanceCounter(&m_liCount);m_i64Start = ((__int64)m_liCount.HighPart << 32) + (__int64)m_liCount.LowPart;//Transform in microseconds(m_i64Start *= 1000000) /= sm_i64Freq;}else//Transform milliseconds to microsecondsm_i64Start = (__int64)GetTickCount() * 1000;m_bRunning = true;
}void CPreciseTimer::StopTimer()
{UpdateElapsed();m_bRunning = false;
}__int64 CPreciseTimer::GetTime()
{if(true == m_bRunning)UpdateElapsed();return m_i64Elapsed;
}
2)类的使用
.......
CPreciseTimer preciseTimer;
// start the timer
preciseTimer.StartTimer();
//here do something ...
// Stop the timer
preciseTimer.StopTimer();
//get the time count
preciseTimer.GetTime();