Your help is needed. Give!
In the ongoing battle to enlighten the world about the evils of zerofilling memory pages, you can make your contribution right now! If you have a machine at your disposal, that is not a G4-400 Mhz G3-350 Mhz, iBook 500 Mhz or iMac 800 Mhz you immediately qualify.
How's that ? Pretty easy requirements! Please compile and run the following code on a system that is close to doing nothing, turn of Mail, turn off iTunes and what ever else might be sucking up CPU time. Compile this with cc -o page-clean-test page-clean-test.m -framework Foundation.
Please send the output result to nat@mulle-kybernetik.com (Harvest be damn SPAM bot!) Please write me the kind of system you ran the test on. If you didn't use Mac OS X 10.2, please tell me also.
Here comes the source...
#import <Foundation/Foundation.h> #include <stdlib.h> #include <stdio.h> #include <time.h> #include <sys/types.h> #include <sys/time.h> #include <sys/wait.h> #include <unistd.h> #include <mach/mach_init.h> #include <mach/vm_map.h> #include <mach/vm_statistics.h> /* Try this to see cost of zero page faulting * in relationship to allocate and deallocate * PAGES=1 LOOPS=200000 */ #define PAGES 1 #define LOOPS (1000*1000) /* Try this to see cost of zero page faulting * in relationship to "other activtity" during * faulting. Some believe zerofill is cheap. * Check it out with Shark. Use a little fuzz, * set samples to 50 us and let run for 300000 * samples or so * PAGES=2048 LOOPS=1000 */ void alloc_loop() { unsigned int i; char *block; for( i = 0; i < LOOPS; i++) { if( vm_allocate( mach_task_self(), (vm_address_t *) &block, PAGES * vm_page_size, 1)) abort(); if( vm_deallocate( mach_task_self(), (vm_address_t) block, PAGES * vm_page_size)) abort(); } } void touch_loop() { unsigned int i, j; char *block; for( i = 0; i < LOOPS; i++) { if( vm_allocate( mach_task_self(), (vm_address_t *) &block, PAGES * vm_page_size, 1)) abort(); for( j = 0; j < PAGES * vm_page_size; j += vm_page_size) block[ j] = 1; if( vm_deallocate( mach_task_self(), (vm_address_t) block, PAGES * vm_page_size)) abort(); } } void alloc_loop2() { unsigned int i; char *block; for( i = 0; i < LOOPS; i++) { if( vm_allocate( mach_task_self(), (vm_address_t *) &block, PAGES * 2 * vm_page_size, 1)) abort(); if( vm_deallocate( mach_task_self(), (vm_address_t) block, PAGES * 2 * vm_page_size)) abort(); } } void touch_loop2() { unsigned int i, j; char *block; for( i = 0; i < LOOPS; i++) { if( vm_allocate( mach_task_self(), (vm_address_t *) &block, PAGES * 2 * vm_page_size, 1)) abort(); for( j = 0; j < PAGES * 2 * vm_page_size; j += vm_page_size) block[ j] = 1; if( vm_deallocate( mach_task_self(), (vm_address_t) block, PAGES * 2 * vm_page_size)) abort(); } } int main() { alloc_loop(); /* warm up */ NSLog( @"Just alloc start\n"); alloc_loop(); NSLog( @"Just alloc stop\n"); NSLog( @"Zero fill start\n"); touch_loop(); NSLog( @"Zero fill stop\n"); NSLog( @"Just alloc start two pages\n"); alloc_loop2(); NSLog( @"Just alloc stop two pages\n"); NSLog( @"Zero fill start two pages\n"); touch_loop2(); NSLog( @"Zero fill stop two pages\n"); return( 0); }