143 lines
3.2 KiB
C
143 lines
3.2 KiB
C
|
//
|
||
|
// The CPerfTimer class can be used to time operations to an accuracy of
|
||
|
// around 1 microsecond.
|
||
|
//
|
||
|
|
||
|
// "#define TIMING 1" to turn Timer macros on.
|
||
|
|
||
|
#undef DeclarePerfTimerOn
|
||
|
#undef DeclarePerfTimerOff
|
||
|
#undef PerfTimerOn_
|
||
|
#undef PerfTimerOff_
|
||
|
#undef PerfTimerResetTotal_
|
||
|
#undef PerfTimerDumpTotal_
|
||
|
#undef PerfTimerReset_
|
||
|
#undef PerfTimerDump_
|
||
|
|
||
|
#undef DeclarePerfTimer
|
||
|
#undef PerfTimerResetTotal
|
||
|
#undef PerfTimerDumpTotal
|
||
|
#undef PerfTimerReset
|
||
|
#undef PerfTimerDump
|
||
|
|
||
|
#if TIMING
|
||
|
|
||
|
// #pragma message(__FILE__ " : warning : PerfTimer macros enabled")
|
||
|
|
||
|
#define DeclarePerfTimerOn(t, sz) CPerfTimer t(sz)
|
||
|
#define DeclarePerfTimerOff(t, sz) CPerfTimer t(sz, FALSE)
|
||
|
|
||
|
#define PerfTimerOn_(perf) perf.On()
|
||
|
#define PerfTimerOff_(perf) perf.Off()
|
||
|
#define PerfTimerResetTotal_(perf) perf.ResetTotal()
|
||
|
#define PerfTimerDumpTotal_(perf,sz) perf.DumpTotal(sz)
|
||
|
#define PerfTimerReset_(perf) perf.Reset()
|
||
|
#define PerfTimerDump_(perf,sz) perf.Dump(sz)
|
||
|
|
||
|
|
||
|
#define DeclarePerfTimer(sz) CPerfTimer perf(sz)
|
||
|
#define PerfTimerResetTotal() PerfTimerResetTotal_(perf)
|
||
|
#define PerfTimerDumpTotal(sz) PerfTimerDumpTotal_(perf, sz)
|
||
|
#define PerfTimerReset() PerfTimerReset_(perf)
|
||
|
#define PerfTimerDump(sz) PerfTimerDump_(perf,sz)
|
||
|
|
||
|
class CPerfTimer
|
||
|
{
|
||
|
public:
|
||
|
CPerfTimer(const char *sz)
|
||
|
{
|
||
|
Init(sz, TRUE);
|
||
|
}
|
||
|
|
||
|
CPerfTimer(const char *sz, BOOL fEnabled)
|
||
|
{
|
||
|
Init(sz, fEnabled);
|
||
|
}
|
||
|
|
||
|
void Init(const char *sz, BOOL fEnabled)
|
||
|
{
|
||
|
m_sz = sz;
|
||
|
m_cEnabled = fEnabled ? 1 : 0;
|
||
|
m_ulTimeStart = 0;
|
||
|
m_ulTimeTotal = 0;
|
||
|
QueryPerformanceFrequency((LARGE_INTEGER *)&m_ulFreq);
|
||
|
}
|
||
|
|
||
|
void On(void)
|
||
|
{
|
||
|
m_cEnabled++;
|
||
|
}
|
||
|
|
||
|
void Off()
|
||
|
{
|
||
|
m_cEnabled--;
|
||
|
}
|
||
|
|
||
|
void ResetTotal(void)
|
||
|
{
|
||
|
m_ulTimeTotal = 0;
|
||
|
}
|
||
|
|
||
|
void Reset(void)
|
||
|
{
|
||
|
QueryPerformanceCounter((LARGE_INTEGER *) &m_ulTimeStart);
|
||
|
}
|
||
|
|
||
|
void Dump(const char *sz)
|
||
|
{
|
||
|
_int64 ulTime;
|
||
|
QueryPerformanceCounter((LARGE_INTEGER *) &ulTime);
|
||
|
ulTime -= m_ulTimeStart;
|
||
|
|
||
|
m_ulTimeTotal += ulTime;
|
||
|
|
||
|
DumpTime(sz, ulTime);
|
||
|
|
||
|
Reset();
|
||
|
}
|
||
|
|
||
|
void DumpTotal(const char *sz)
|
||
|
{
|
||
|
DumpTime(sz, m_ulTimeTotal);
|
||
|
}
|
||
|
|
||
|
void DumpTime(const char *sz, _int64 ulTime)
|
||
|
{
|
||
|
if (m_cEnabled > 0)
|
||
|
{
|
||
|
_int64 nSecs = (ulTime / m_ulFreq);
|
||
|
_int64 nMilliSecs = ((ulTime * 1000L) / m_ulFreq) % 1000;
|
||
|
_int64 nMicroSecs = ((ulTime * 1000000L) / m_ulFreq) % 1000;
|
||
|
|
||
|
TRACE("%s %s: %lu s %lu.%3.3lu ms\n", m_sz, sz,
|
||
|
(ULONG) nSecs, (ULONG) nMilliSecs, (ULONG) nMicroSecs);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected:
|
||
|
const char * m_sz;
|
||
|
_int64 m_ulTimeStart;
|
||
|
_int64 m_ulTimeTotal;
|
||
|
_int64 m_ulFreq;
|
||
|
int m_cEnabled;
|
||
|
};
|
||
|
|
||
|
#else
|
||
|
|
||
|
#define DeclarePerfTimerOn(sz,t)
|
||
|
#define DeclarePerfTimerOff(sz,t)
|
||
|
#define PerfTimerOn_(perf)
|
||
|
#define PerfTimerOff_(perf)
|
||
|
#define PerfTimerResetTotal_(perf)
|
||
|
#define PerfTimerDumpTotal_(perf,sz)
|
||
|
#define PerfTimerReset_(perf)
|
||
|
#define PerfTimerDump_(perf,sz)
|
||
|
|
||
|
|
||
|
#define DeclarePerfTimer(sz)
|
||
|
#define PerfTimerResetTotal()
|
||
|
#define PerfTimerDumpTotal(sz)
|
||
|
#define PerfTimerReset()
|
||
|
#define PerfTimerDump(sz)
|
||
|
#endif
|