#include #include #include #include #include #define SEG_1_SIZE 1024 * 1024 #define SEG_X_SIZE 1024 * 1024 * 64 #define W32_MEMMAN_ITERATIONS 150 #define W32_MEMMAN_ITERATIONS2 20000 #define W32_MMST04_ITERATIONS 100 #define MemManSubtest5Count 200 int TotalBenchMarks = 0; #define MAX_BENCHMARKS 32 char *BenchMarkNames[ MAX_BENCHMARKS ]; ULONG BenchMarkRates[ MAX_BENCHMARKS ]; ULONG BenchMarkFracs[ MAX_BENCHMARKS ]; typedef struct _PERFINFO { DWORD StartTime; DWORD StopTime; PCHAR Title; ULONG Iterations; } PERFINFO, *PPERFINFO; int StartBenchMark( PCHAR Title, ULONG Iterations, PPERFINFO PerfInfo ); VOID FinishBenchMark( PPERFINFO PerfInfo ); _CRTAPI1 main() { PCHAR p1, p2, p3, p4; // pointers into new segment PCHAR pa[MemManSubtest5Count]; // array for section pointers PULONG u1; ULONG actual; // actual xfer count for read ULONG ssize; // section allocation size var ULONG ii, ix; // loop index variables PERFINFO PerfInfo; ULONG Seg1Size; ULONG SegxSize; ULONG CommitSize; HANDLE CurrentProcessHandle, Section1; LARGE_INTEGER SectionSize; ULONG Size; ULONG ViewSize; printf("Win32 Memory Management test\n"); Size = 1024L * 1024L; p1 = NULL; p1 = VirtualAlloc (NULL, Size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); if (p1 == NULL) { printf("failed first created vm status %X start %lx size %lx\n", GetLastError(), (ULONG)p1, Size); } for (p2=p1; p2 < (p1 + Size); p2 += 4) { u1 = (PULONG)p2; *u1 = (ULONG)p2; } // for SectionSize.LowPart = 1024*1024; SectionSize.HighPart = 0; Section1 = CreateFileMapping ((HANDLE)0xffffffff, NULL, PAGE_READWRITE | SEC_COMMIT, SectionSize.HighPart, SectionSize.LowPart, NULL); if (!Section1) { printf("failed create big section status %ld\n", GetLastError()); } p3 = NULL; ViewSize = 0; p3 = MapViewOfFile (Section1, FILE_MAP_WRITE, 0L, 0, 0); if (!p1) { printf("service failed mapview - status %ld\n", GetLastError()); } MoveMemory ((PVOID)p3, (PVOID)p1, Size); StartBenchMark( "Win32 MemMan00 -- 1 Meg Copy", 150, &PerfInfo ); // // Memory Management sub-test 1 -- // // Create a 1 MB segment with commitment of the pages, // then touch each page, which should cause a fault and // a demand zero page to be allocated. // // for (ii=0; ii<150; ii++) { MoveMemory ((PVOID)p3, (PVOID)p1, Size); } FinishBenchMark( &PerfInfo ); CloseHandle (Section1); if (!UnmapViewOfFile (p3)) { printf("unmap view service failed - status %ld\n", GetLastError()); } // // Memory Management sub-test 1 -- // // Create a 1 MB segment with commitment of the pages, // then touch each page, which should cause a fault and // a demand zero page to be allocated. // // StartBenchMark( "Win32 MemMan01 -- create 1mb section, copy 1mb, delete", 150, &PerfInfo ); for (ii=0; ii<150; ii++) { Section1 = CreateFileMapping ((HANDLE)0xffffffff, NULL, PAGE_READWRITE | SEC_COMMIT, SectionSize.HighPart, SectionSize.LowPart, NULL); if (!Section1) { printf("failed create big section status %ld\n", GetLastError()); } p3 = MapViewOfFile (Section1, FILE_MAP_WRITE, 0L, 0, 0); if (!p3) { printf("service failed mapview - status %ld\n", GetLastError()); } MoveMemory ((PVOID)p3, (PVOID)p1, Size); p4 = MapViewOfFile (Section1, FILE_MAP_WRITE, 0L, 0, 0); if (!p4) { printf("service failed mapview - status %ld\n", GetLastError()); } CloseHandle (Section1); if (!UnmapViewOfFile (p3)) { printf("unmap view service failed - status %ld\n", GetLastError()); } if (!UnmapViewOfFile (p4)) { printf("unmap view service failed - status %ld\n", GetLastError()); } } FinishBenchMark( &PerfInfo ); // // Memory Management sub-test 1 -- // // Create a 1 MB segment with commitment of the pages, // then touch each page, which should cause a fault and // a demand zero page to be allocated. // // StartBenchMark( "Win32 MemMan02 -- alloc 1mb vm, copy 1mb, delete", 150, &PerfInfo ); for (ii=0; ii<150; ii++) { Size = 1024*1024; p3 = VirtualAlloc (NULL, Size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); if (!p3) { printf("service failed allocvm - status %ld\n", GetLastError()); } MoveMemory ((PVOID)p3, (PVOID)p1, Size); if (!VirtualFree (p3,0,MEM_RELEASE)) { printf("service failed freevm1 - status %ld\n", GetLastError()); } } FinishBenchMark( &PerfInfo ); if (!VirtualFree (p1,0,MEM_RELEASE)) { printf("service failed freevm2 - status %ld\n", GetLastError()); } // // start regular benchmarks. // StartBenchMark( "Win32 MemMan1 -- 1 Meg Seg, Create, Commit & Touch", W32_MEMMAN_ITERATIONS, &PerfInfo ); // // Memory Management sub-test 1 -- // // Create a 1 MB segment with commitment of the pages, // then touch each page, which should cause a fault and // a demand zero page to be allocated. // // for (ii=0; iiTitle = Title, PerfInfo->Iterations = Iterations ); PerfInfo->StartTime = GetCurrentTime(); return( TRUE ); } VOID FinishBenchMark( PPERFINFO PerfInfo ) { ULONG TotalMilliSeconds; ULONG IterationsPerSecond; ULONG IterationFractions; DWORD Delta; PerfInfo->StopTime = GetCurrentTime(); TotalMilliSeconds = PerfInfo->StopTime - PerfInfo->StartTime; IterationsPerSecond = (1000 * PerfInfo->Iterations) / TotalMilliSeconds; IterationFractions = (1000 * PerfInfo->Iterations) % TotalMilliSeconds; IterationFractions = (1000 * IterationFractions) / TotalMilliSeconds; if (1) { printf( " iterations - %9d\n", PerfInfo->Iterations ); printf( " milliseconds - %9d\n", TotalMilliSeconds ); printf( " iterations/sec - %5d.%3d\n\n", IterationsPerSecond, IterationFractions ); } BenchMarkNames[ TotalBenchMarks ] = PerfInfo->Title; BenchMarkRates[ TotalBenchMarks ] = IterationsPerSecond; BenchMarkFracs[ TotalBenchMarks ] = IterationFractions; TotalBenchMarks++; }