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();