/****************************************************************************/ /* Copyright(C) Microsoft Corporation 1998 */ /****************************************************************************/ /****************************************************************************/ /* */ /* CPU Cycle counter */ /* */ /****************************************************************************/ #if defined(OS_WIN32) && !defined(DC_DEBUG) && defined(_M_IX86) && defined(PERF) /****************************************************************************/ /* */ /* CPU Cycle counter macros */ /* */ /****************************************************************************/ /****************************************************************************/ /* variables used to store the count */ /****************************************************************************/ #define MAX_FNS 12 /****************************************************************************/ /* Counter identifiers */ /****************************************************************************/ #define FC_MEM2SCRN_BITBLT 0 #define FC_DSTBLT_TYPE 1 #define FC_PATBLT_TYPE 2 #define FC_OPAQUERECT_TYPE 3 #define FC_SCRBLT_TYPE 4 #define FC_MEMBLT_TYPE 5 #define FC_LINETO_TYPE 6 #define FC_POLYLINE_TYPE 7 #define FC_INDEX_TYPE 8 #define FC_UHADDUPDATEREGION 9 #define FC_UHSETCLIPREGION 10 #define FC_UHPROCESSPALETTEPDU 11 #define FC_POLYGONSC_TYPE 12 #define FC_POLYGONCB_TYPE 13 #define FC_ELLIPSESC_TYPE 14 #define FC_ELLIPSECB_TYPE 15 #define FC_FAST_INDEX_TYPE 16 #define FC_FAST_GLYPH_TYPE 17 /****************************************************************************/ /* Routines to measure the count before and after */ /****************************************************************************/ #define TIMERSTART \ { \ unsigned long startHi; \ unsigned long startLo; \ unsigned long endHi; \ unsigned long endLo; \ \ unsigned long timeLo; \ unsigned long timeHi; \ \ \ _asm mov eax,0 \ _asm mov edx,0 \ \ _asm _emit 0Fh \ _asm _emit 31h \ _asm mov startHi, edx \ _asm mov startLo, eax \ #define TIMERSTOP \ _asm mov eax,0 \ _asm mov edx,0 \ \ _asm _emit 0Fh \ _asm _emit 31h \ _asm mov endHi, edx \ _asm mov endLo, eax \ #define UPDATECOUNTER(fn) \ callCount[fn]++; \ \ if (endLo < startLo) \ { \ timeLo = 0xFFFFFFFF - (startLo - endLo - 1); \ endHi--; \ } \ else \ { \ timeLo = endLo - startLo; \ } \ \ timeHi = endHi - startHi; \ \ cycleCountLo[fn] = (unsigned long)(cycleCountLo[fn] + timeLo);\ \ if (cycleCountLo[fn] < timeLo) \ { \ timeHi++; \ } \ \ cycleCountHi[fn] += timeHi; \ } #define RESET_COUNTERS \ { \ int idx; \ for (idx = 0; idx < MAX_FNS; idx++)\ { \ callCount[idx] = 0; \ cycleCountHi[idx] = 0; \ cycleCountLo[idx] = 0; \ } \ \ OutputDebugString(_T("Counters Reset\n")); \ \ } \ #define OUTPUT_COUNTERS \ { \ int idx; \ TCHAR result[80]; \ TCHAR fnNames[MAX_FNS][30] = \ { \ _T("BitmapRect sub order *"), \ _T("DSTBLT order"), \ _T("PATBLT order"), \ _T("OPAQUERECT order"), \ _T("SCRBLT order"), \ _T("MEMBLT order **"), \ _T("LINETO order **"), \ _T("POLYLINE order"), \ _T("INDEX (glyph) order *"), \ _T("UHAddUpdateRegion *"), \ _T("UHSetClipRegion *"), \ _T("UHProcessPalettePDU *"), \ _T("POLYGONSC order"), \ _T("POLYGONCB order"), \ _T("ELLIPSESC order"), \ _T("ELLIPSECB order"), \ _T("FASTINDEX order"), \ _T("FASTGLYPH order") }; \ \ OutputDebugString(_T("******************************************")\ _T("\n")); \ _stprintf(result, _T("%-29s %-6s %-12s %-12s\n"), _T("Operation"),\ _T("Hits"), _T("High cycles"), _T("Low cycles")); \ \ OutputDebugString(result); \ for (idx = 0; idx < MAX_FNS; idx++) \ { \ _stprintf(result, _T("%-29s %6lu %12lu %12lu\n"), \ fnNames[idx], callCount[idx], \ cycleCountHi[idx], cycleCountLo[idx]); \ OutputDebugString(result); \ } \ OutputDebugString(_T("******************************************")\ _T("\n")); \ } \ #else #define MAX_FNS #define TIMERSTART #define TIMERSTOP #define UPDATECOUNTER(fn) #define RESET_COUNTERS #define OUTPUT_COUNTERS #endif