1)类的实现
#ifndef CPRECISETIMER_H
#define CPRECISETIMER_H
#include <windows.h>
class CPreciseTimer
{
public:
CPreciseTimer();
bool SupportsHighResCounter();
void StartTimer();
void StopTimer();
__int64 GetTime();
private:
//Auxiliary Function
void UpdateElapsed();
//Member variables
bool m_bRunning;
__int64 m_i64Start;
__int64 m_i64Elapsed;
//Some auxiliary variables
__int64 m_i64Counts;
LARGE_INTEGER m_liCount;
//Static Variables
static 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 microseconds
m_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 initialized
if(false == sm_bInit)
{
//Initializing some static variables dependent on the system just once
LARGE_INTEGER liFreq;
if(TRUE == QueryPerformanceFrequency(&liFreq))
{
//Only if the system is supporting High Performance
sm_i64Freq = ((__int64)liFreq.HighPart << 32) + (__int64)liFreq.LowPart;
sm_bPerformanceCounter = true;
}
else
sm_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 microseconds
m_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();