152 lines
4.5 KiB
C
152 lines
4.5 KiB
C
/*==========================================================================
|
|
*
|
|
* Copyright (C) 2001 Microsoft Corporation. All Rights Reserved.
|
|
*
|
|
* File: PerfMacs.h
|
|
* Content: Performance Instrumentation macros.
|
|
*
|
|
*
|
|
* History:
|
|
* Date By Reason
|
|
* ==== == ======
|
|
* 03/21/01 RichGr Created
|
|
*
|
|
* Usage:
|
|
* As Whistler/XP and DX 8.1 are now locked down for beta 2, this should
|
|
* not be included as part of the official builds. So just include this file
|
|
* temporarily when you need to instrument some functions.
|
|
* Specify these macros before and after what you want to time:
|
|
START_QPC
|
|
DoSomeWork
|
|
END_QPC
|
|
|
|
* Then temporarily change dndbg.cpp by replacing
|
|
this:
|
|
#include "dndbg.h"
|
|
#include "memlog.h"
|
|
|
|
#if defined(DEBUG)
|
|
|
|
|
|
with this:
|
|
#if defined(DPINST) && !defined(DEBUG)
|
|
#define DEBUG
|
|
#include "dndbg.h"
|
|
#include "memlog.h"
|
|
#undef DEBUG
|
|
#else
|
|
#include "dndbg.h"
|
|
#include "memlog.h"
|
|
#endif
|
|
|
|
#if defined(DEBUG) || defined(DPINST)
|
|
|
|
* To build the instrumented binaries, set C_DEFINES=-DDPINST in your razzle build
|
|
* environment. Both free and checked builds can be instrumented. If you want to
|
|
* put the bins in a different directory, set BUILD_ALT_DIR=i where 'i' is the character
|
|
* you want to append to \obj.
|
|
*
|
|
* To get useful results, you will usually need to use the shared memory
|
|
* log option (log=2 in win.ini) and run free binaries. If you run the checked
|
|
* binaries, you should keep the amount of debug output low.
|
|
*
|
|
*
|
|
***************************************************************************/
|
|
|
|
|
|
#ifndef __PERFMACS_H__
|
|
#define __PERFMACS_H__
|
|
|
|
#ifdef DEBUG
|
|
#define DPINST
|
|
#endif
|
|
|
|
#ifdef DPINST
|
|
#pragma message("DPINST is defined and binaries are instrumented")
|
|
|
|
#define DPINST_CRITSEC FALSE // Specify TRUE or FALSE
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
//**********************************************************************
|
|
// Constant definitions
|
|
//**********************************************************************
|
|
|
|
// #undef and #define this again before the code you're timing
|
|
// if you want to change the logging threshold.
|
|
#define QPC_THRESHOLD 10 // 10 usecs
|
|
|
|
|
|
//**********************************************************************
|
|
// Macro definitions
|
|
//**********************************************************************
|
|
|
|
// To provide local scope for n64QPCStart and n64QPCEnd, QPC_START has
|
|
// an unbalanced open { and QPC_END has the balancing close }.
|
|
#define START_QPC \
|
|
{ \
|
|
__int64 n64QPCStart, n64QPCEnd, n64QPCDiff; \
|
|
if (g_bQPC_Not_Inited) \
|
|
{ \
|
|
QueryPerformanceFrequency((LARGE_INTEGER*)&g_n64QPCFrequency); \
|
|
g_bQPC_Not_Inited = FALSE; \
|
|
} \
|
|
QueryPerformanceCounter((LARGE_INTEGER*)&n64QPCStart);
|
|
|
|
// a) We can handle wraps.
|
|
// b) Below a certain threshold, we don't want to log the elapsed time.
|
|
// c) We don't compensate for thread switches.
|
|
#define END_QPC \
|
|
QueryPerformanceCounter((LARGE_INTEGER*)&n64QPCEnd); \
|
|
if (n64QPCEnd >= n64QPCStart) \
|
|
n64QPCDiff = n64QPCEnd - n64QPCStart; \
|
|
else \
|
|
n64QPCDiff = (0x7fffffffffffffff - n64QPCStart) + 1 + n64QPCEnd; \
|
|
n64QPCDiff = n64QPCDiff * 1000000 / g_n64QPCFrequency; \
|
|
if (n64QPCDiff < 0) \
|
|
n64QPCDiff = 0; \
|
|
if (n64QPCDiff >= QPC_THRESHOLD) \
|
|
DebugPrintfX(__FILE__, __LINE__, DPF_MODNAME, DPF_SUBCOMP, DPF_ERRORLEVEL, "%d usecs", (DWORD)n64QPCDiff); \
|
|
}
|
|
|
|
|
|
//**********************************************************************
|
|
// Redefinitions of existing macros
|
|
//**********************************************************************
|
|
#if DPINST_CRITSEC == TRUE
|
|
#undef DNEnterCriticalSection
|
|
|
|
#define DNEnterCriticalSection( arg ) DNTimeEnterCriticalSection( arg )
|
|
#endif
|
|
|
|
|
|
//**********************************************************************
|
|
// Global Variable definitions
|
|
//**********************************************************************
|
|
|
|
static __int64 g_n64QPCFrequency = 0;
|
|
static BOOL g_bQPC_Not_Inited = TRUE;
|
|
|
|
|
|
//**********************************************************************
|
|
// Function Prototypes
|
|
//**********************************************************************
|
|
|
|
void DebugPrintfX(LPCSTR szFile, DWORD dwLineNumber,LPCSTR szFnName, DWORD dwSubComp, volatile DWORD_PTR dwDetail, ...);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
} //extern "C"
|
|
#endif
|
|
|
|
#else // NULL definition
|
|
|
|
#define START_QPC
|
|
#define END_QPC
|
|
|
|
#endif //#ifdef DPINST
|
|
|
|
#endif // __PERFMACS_H__
|