Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

243 lines
7.5 KiB

//
// perfct.cpp
//
#include "private.h"
#include "perfct.h"
#ifdef DEBUG
extern DBG_MEMSTATS s_Dbg_MemStats;
DBG_MEM_COUNTER g_rgPerfObjCounters[] =
{
{ TEXT("CAnchorRef: "), 0 },
{ TEXT("CRange: "), 0 },
{ TEXT("CLoaderACP: "), 0 },
{ TEXT("CACPWrap: "), 0 },
{ TEXT("CAnchorList: "), 0 },
{ TEXT("CAnchor: "), 0 },
{ TEXT("CEnumAppPropRanges: "), 0 },
{ TEXT("CAppProperty: "), 0 },
{ TEXT("CEnumUberRanges: "), 0 },
{ TEXT("CUberProperty: "), 0 },
{ TEXT("CEnumProperties: "), 0 },
{ TEXT("CProperty: "), 0 },
{ TEXT("CCategoryMgr: "), 0 },
{ TEXT("CEnumCategories: "), 0 },
{ TEXT("CCompartmentMgr: "), 0 },
{ TEXT("CEnumCompartment: "), 0 },
{ TEXT("CCompartment: "), 0 },
{ TEXT("CGlobalCompartment: "), 0 },
{ TEXT("CCompartmentSub: "), 0 },
{ TEXT("CEditRecord: "), 0 },
{ TEXT("CEnumPropertyRanges: "), 0 },
{ TEXT("CInputContext: "), 0 },
{ TEXT("CSpanSet: "), 0 },
{ TEXT("PROPERTYLIST: "), 0 },
{ TEXT("---------------------"), 0 },
{ TEXT("CACPWrap::GetText "), 0 },
{ TEXT("CACPWrap:GetText:loop"), 0 },
{ TEXT("ShiftRegion:GetText "), 0 },
{ TEXT("GetTextComp:GetText "), 0 },
{ TEXT("PlainTextOff:GetText "), 0 },
{ TEXT("ATOF GetText calls: "), 0 },
{ TEXT("ShiftCond:GetText "), 0 },
{ TEXT("---------------------"), 0 },
{ TEXT("ATOF calls: "), 0 },
{ TEXT("ATON calls: "), 0 },
{ TEXT("Normalize calls: "), 0 },
{ TEXT("ShiftRegion calls: "), 0 },
{ TEXT("Renormalize calls: "), 0 },
{ TEXT("---------------------"), 0 },
{ TEXT("CreateRangeACP "), 0 },
{ TEXT("Lazy:Norm "), 0 },
{ TEXT("---------------------"), 0 },
{ TEXT("ITfRange::ShiftStart "), 0 },
{ TEXT("ITfRange::ShiftEnd "), 0 },
{ TEXT("ITfRange::GetText "), 0 },
{ TEXT("ITfRange::SetText "), 0 },
{ TEXT("CAnchorRef::Shift "), 0 },
{ TEXT("key down events "), 0 },
};
#endif // DEBUG
#ifdef PERF_DUMP
LARGE_INTEGER g_liPerfFreq = { 0 };
ULONG g_cStrokes = 0;
struct
{
LARGE_INTEGER liStart[PERF_STROKE_ARRAYSIZE];
LARGE_INTEGER liEnd[PERF_STROKE_ARRAYSIZE];
}
g_rgPerfStrokes[2048] = { 0 };
BOOL Perf_Init()
{
QueryPerformanceFrequency(&g_liPerfFreq);
return TRUE;
}
//+---------------------------------------------------------------------------
//
// Perf_GetTicks
//
//----------------------------------------------------------------------------
LARGE_INTEGER GetTicks()
{
LARGE_INTEGER li;
if (g_liPerfFreq.QuadPart != 0)
{
QueryPerformanceCounter(&li);
}
else
{
li.LowPart = GetTickCount();
li.HighPart = 0;
}
return li;
}
//+---------------------------------------------------------------------------
//
// Perf_GetTickDifference
//
//----------------------------------------------------------------------------
ULONG GetTickDifference(LARGE_INTEGER liStartTicks, LARGE_INTEGER liEndTicks)
{
liEndTicks.QuadPart -= liStartTicks.QuadPart;
if (g_liPerfFreq.QuadPart != 0)
{
liEndTicks.QuadPart /= (g_liPerfFreq.QuadPart / 1000);
}
return liEndTicks.LowPart;
}
//+---------------------------------------------------------------------------
//
// Perf_StartStroke
//
//----------------------------------------------------------------------------
void Perf_StartStroke(UINT iIndex)
{
LARGE_INTEGER liPrevTotal;
if (g_cStrokes < ARRAYSIZE(g_rgPerfStrokes))
{
liPrevTotal.QuadPart = g_rgPerfStrokes[g_cStrokes].liEnd[iIndex].QuadPart - g_rgPerfStrokes[g_cStrokes].liStart[iIndex].QuadPart;
g_rgPerfStrokes[g_cStrokes].liStart[iIndex].QuadPart = GetTicks().QuadPart - liPrevTotal.QuadPart;
}
}
//+---------------------------------------------------------------------------
//
// Perf_EndStroke
//
//----------------------------------------------------------------------------
void Perf_EndStroke(UINT iIndex)
{
if (g_cStrokes < ARRAYSIZE(g_rgPerfStrokes))
{
g_rgPerfStrokes[g_cStrokes].liEnd[iIndex] = GetTicks();
}
if (iIndex == PERF_STROKE_DOWN)
{
g_cStrokes++;
}
}
#include <stdio.h>
//+---------------------------------------------------------------------------
//
// Perf_DumpStats
//
//----------------------------------------------------------------------------
void Perf_DumpStats()
{
//
// add the application name to check the cicero's performance.
//
static const TCHAR *c_rgPerfProcesses[] =
{
TEXT("notepad.exe"),
};
FILE *file;
TCHAR ach[MAX_PATH];
DWORD cch;
DWORD cchTest;
LONG i;
//
// only dump perf info for certain processes
//
for (i=0; i<ARRAYSIZE(c_rgPerfProcesses); i++)
{
cchTest = lstrlen(c_rgPerfProcesses[i]);
if ((cch = GetModuleFileName(0, ach, ARRAYSIZE(ach))) < cchTest)
continue;
if (lstrcmpi(ach+cch-cchTest, c_rgPerfProcesses[i]) != 0)
continue;
break;
}
if (i == ARRAYSIZE(c_rgPerfProcesses))
return;
file = fopen("c:\\perf.txt", "w");
fprintf(file, "****************************************************************\n");
fprintf(file, "Cicero Perf Counters (%s)\n", c_rgPerfProcesses[i]);
fprintf(file, "****************************************************************\n");
fprintf(file, "\n\n");
#ifdef DEBUG
for (i=0; i<ARRAYSIZE(g_rgPerfObjCounters); i++)
{
fprintf(file, "%s %d\n", g_rgPerfObjCounters[i].pszDesc, g_rgPerfObjCounters[i].uCount);
}
fprintf(file, "\n\n");
fprintf(file, "cicMemAlloc: %d\n", s_Dbg_MemStats.uTotalMemAllocCalls);
fprintf(file, "cicMemAllocClear: %d\n", s_Dbg_MemStats.uTotalMemAllocClearCalls);
fprintf(file, "cicMemReAlloc: %d\n", s_Dbg_MemStats.uTotalMemReAllocCalls);
#endif // DEBUG
fprintf(file, "\n\n");
for (i=0; i<(int)min(g_cStrokes, ARRAYSIZE(g_rgPerfStrokes)); i++)
{
ULONG ulElapsedDn = GetTickDifference(g_rgPerfStrokes[i].liStart[PERF_STROKE_DOWN], g_rgPerfStrokes[i].liEnd[PERF_STROKE_DOWN]);
ULONG ulElapsedUp = GetTickDifference(g_rgPerfStrokes[i].liStart[PERF_STROKE_UP], g_rgPerfStrokes[i].liEnd[PERF_STROKE_UP]);
ULONG ulElapsedTestDn = GetTickDifference(g_rgPerfStrokes[i].liStart[PERF_STROKE_TESTDOWN], g_rgPerfStrokes[i].liEnd[PERF_STROKE_TESTDOWN]);
ULONG ulElapsedTestUp = GetTickDifference(g_rgPerfStrokes[i].liStart[PERF_STROKE_TESTUP], g_rgPerfStrokes[i].liEnd[PERF_STROKE_TESTUP]);
ULONG ulElapsedGetMessage = GetTickDifference(g_rgPerfStrokes[i].liStart[PERF_STROKE_GETMSG], g_rgPerfStrokes[i].liEnd[PERF_STROKE_GETMSG]);
ULONG ulPrev = (i == 0) ? 0 : GetTickDifference(g_rgPerfStrokes[i-1].liEnd[PERF_STROKE_DOWN], g_rgPerfStrokes[i].liEnd[PERF_STROKE_DOWN]);
ULONG ulPercent = (i == 0) ? 0 : (ulElapsedDn+ulElapsedUp+ulElapsedTestUp+ulElapsedTestDn)*100/ulPrev;
fprintf(file, "KeyDown %d: %d/%d/%d/%d (%d) (%d%% of %d)\n", i,
ulElapsedDn, ulElapsedUp, ulElapsedTestDn, ulElapsedTestUp, ulElapsedGetMessage, ulPercent, ulPrev);
}
fclose(file);
}
#endif // PERF_DUMP