windows-nt/Source/XPSP1/NT/multimedia/dshow/guidestore/timing.h
2020-09-26 16:20:57 +08:00

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