windows-nt/Source/XPSP1/NT/com/rpc/perf/local/local.c

345 lines
9.2 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (C) Microsoft Corporation, 1994 - 1999
Module Name:
local.c
Abstract:
RPC performance to measure system/processor/memory overhead.
memcpy, string operations, memory allocation, kernel traps
Author:
Mario Goertzel (mariogo) 30-Mar-1994
Revision History:
--*/
#include<rpcperf.h>
#define REGISTRY_ROOT_KEY HKEY_LOCAL_MACHINE
static char * RPC_UUID_PERSISTENT_DATA="Software\\Description\\Microsoft\\Rpc\\3.1\\RpcUuidPersistentData";
static char * PREV_CLOCK_SEQUENCE="PreviousClockSequence";
static char * PREV_TIME_ALLOCATED="PreviousTimeAllocated";
const char *USAGE="-n case -i iterations\n"
" -n 1 - Memory copy\n"
" -n 2 - String copy\n"
" -n 3 - String length\n"
" -n 4 - Allocate/free memory\n"
" -n 5 - Kernel traps (set and reset event)\n"
" -n 6 - GetTickCount\n"
" -n 7 - Open & Query Registry\n"
" -n 8 - Query Registry\n"
" -n 9 - Open & Update Registry\n"
" -n 10 - Update Registry\n";
int __cdecl
main(int argc, char **argv)
{
unsigned int i;
int size;
unsigned long seconds, mseconds;
char *buffer;
char *buffer2;
HANDLE event;
HANDLE heap;
long status;
ParseArgv(argc, argv);
if (Options[0] == -1)
{
puts(USAGE);
exit(1);
}
if (Options[0] < 4 && Options[0] > 0)
{
if ((Options[1] < 0) || (Options[2] < 0) || (Options[2] < Options[1]))
{
printf("Case %d requires -n start -n end_size switches\n",
Options[0]);
exit(1);
}
buffer = RtlAllocateHeap(RtlProcessHeap(),0,Options[2]);
buffer2 = RtlAllocateHeap(RtlProcessHeap(),0,Options[2]);
// For string tests
for(i = 0; i < (unsigned long)Options[1]; i++)
buffer[i] = 'M';
printf("Start size, end size: %d, %d\n", Options[1], Options[2]);
}
switch (Options[0])
{
case 1:
// Memory copy test
size = Options[1];
while(size < Options[2])
{
printf("Size: % 6d : ", size);
StartTime();
for(i = 0; i < Iterations; i++)
memcpy(buffer,buffer2,size);
EndTime("for memcpy");
size *= 2;
}
break;
case 2:
// String copy test
size = Options[1];
while(size < Options[2])
{
printf("Lenght: % 6d : ", size);
for(i = 0; i < (unsigned long)size-1; i++)
buffer[i] = 'A';
buffer[size-1] = '\0';
StartTime();
for(i = 0; i < Iterations; i++)
strcpy(buffer2, buffer);
EndTime("for strcpy");
size *= 2;
}
break;
case 3:
// String len test
size = Options[1];
while(size < Options[2])
{
printf("Lenght: % 6d : ", size);
for(i = 0; i < (unsigned long)size-1; i++)
buffer[i] = 'A';
buffer[size-1] = '\0';
StartTime();
for(i = 0; i < Iterations; i++)
strlen(buffer);
EndTime("for strlen");
size *= 2;
}
break;
case 4:
// Allocate/Free tests
if (Options[1] == -1)
{
printf("Memory test requires an addition -n switch for block size\n");
exit(1);
}
printf("Block size: %d\n", Options[1]);
heap = RtlProcessHeap();
StartTime();
for(i = 0; i < Iterations; i++)
{
buffer = RtlAllocateHeap(heap,0,Options[1]);
RtlFreeHeap(heap, 0, buffer);
}
EndTime("for Rtl{Alloc,Free}Heap");
StartTime();
for(i = 0; i < Iterations; i++)
{
buffer = malloc(Options[1]);
free(buffer);
}
EndTime("for Malloc/Free");
StartTime();
for(i = 0; i < Iterations; i++)
{
buffer = LocalAlloc(0, Options[1]);
LocalFree(buffer);
}
EndTime("for Local{Alloc/Free} (0)");
StartTime();
for(i = 0; i < Iterations; i++)
{
buffer = LocalAlloc(LPTR, Options[1]);
LocalFree(buffer);
}
EndTime("for Local{Alloc/Free} (LPTR)");
break;
case 5:
// Kernel traps
event = CreateEvent(0, FALSE, FALSE, 0);
CHECK_STATUS(event == 0, "CreateEvent");
StartTime();
for(i = 0; i < Iterations; i++)
SetEvent(event);
EndTime("for SetEvent");
StartTime();
for(i = 0; i < Iterations; i++)
ResetEvent(event);
EndTime("for ResetEvent");
break;
case 6:
// GetTickCount
StartTime();
for(i = 0; i < Iterations; i++)
GetTickCount();
EndTime("for GetTickCount");
break;
case 7:
{
// Open and Query Registry
HKEY Key;
DWORD BufLen = 30;
char String[30];
StartTime();
for (i = 0; i < Iterations; i++)
{
status =
RegOpenKey(REGISTRY_ROOT_KEY,
RPC_UUID_PERSISTENT_DATA,
&Key);
if (status)
printf("RegOpenKey returned %d\n", status);
status =
RegQueryValue(Key,
PREV_CLOCK_SEQUENCE,
String,
&BufLen);
if (status)
printf("RegQueryValue returned %d\n", status);
RegCloseKey(Key);
}
EndTime("for opening and querying a registry key");
}
break;
case 8:
{
// Query Registry
HKEY Key;
DWORD BufLen = 30;
char String[30];
status =
RegOpenKey(REGISTRY_ROOT_KEY,
RPC_UUID_PERSISTENT_DATA,
&Key);
if (status)
printf("RegOpenKey returned %d\n", status);
StartTime();
for (i = 0; i < Iterations; i++)
{
status =
RegQueryValue(Key,
PREV_CLOCK_SEQUENCE,
String,
&BufLen);
if (status)
printf("RegQueryValue returned %d\n", status);
}
EndTime("for querying a registry key");
RegCloseKey(Key);
}
break;
case 9:
{
// Create and update.
HKEY Key;
DWORD BufLen;
static const char String[] = "24682468";
StartTime();
for (i = 0; i < Iterations; i++)
{
status =
RegCreateKey(REGISTRY_ROOT_KEY,
RPC_UUID_PERSISTENT_DATA,
&Key);
if (status)
printf("RegOpenKey returned %d\n", status);
status =
RegSetValue(Key,
PREV_CLOCK_SEQUENCE,
REG_SZ,
String,
strlen(String)+1);
if (status)
printf("RegSetValue returned %d\n", status);
RegCloseKey(Key);
}
EndTime("for creating and updateing a registry key.");
}
break;
case 10:
{
// Update Registry
HKEY Key;
DWORD BufLen;
static const char String[] = "24682468";
status =
RegCreateKey(REGISTRY_ROOT_KEY,
RPC_UUID_PERSISTENT_DATA,
&Key);
if (status)
printf("RegOpenKey returned %d\n", status);
StartTime();
for (i = 0; i < Iterations; i++)
{
status =
RegSetValue(Key,
PREV_CLOCK_SEQUENCE,
REG_SZ,
String,
strlen(String)+1);
if (status)
printf("RegSetValue returned %d\n", status);
}
EndTime("for updating a registry key.");
RegCloseKey(Key);
}
break;
}
return 0;
}