/* a pagefault benchmark kazutomo@mcs.anl.gov */ #include #include #include #include #include #include #include static double gettime(void) { struct timeval tv; gettimeofday(&tv, 0); return (double)tv.tv_sec + (double)tv.tv_usec/1000.0/1000.0; } static void test_pagefault(int mode, size_t bufsize ) { char *p; double t1,t2; int i, pagesize = getpagesize(); printf("pagesize: %d bytes\n", pagesize); t1 = gettime(); if( mode==0 ) { p = mmap(NULL, bufsize, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_POPULATE, -1, 0); assert( p ); } else { p = malloc( bufsize ); assert( p ); if( mode == 1 ) for(i=0;i %lf MB/sec\n", t2-t1, (bufsize/(t2-t1))/1024.0/1024.0 ); } t1 = gettime(); if( mode == 0 ) { munmap( p, bufsize ); } else { free(p); } t2 = gettime(); printf("free: %lf sec\n", t2-t1); } int main(int argc, char **argv) { int mode=0; int bufsize = 10*1024*1024; if( argc < 2 ) { printf("Usage: pftest mode [bufsize]\n"); printf("\n"); printf("mode=0: mmap with MAP_POPULATE\n"); printf("mode=1: malloc and a simple prefault loop\n"); printf("mode>1: malloc\n"); printf("\n"); exit(1); } mode = atoi(argv[1]); if( argc > 2 ) { bufsize = atoi(argv[2]); } printf("mode: %d\n", mode); printf("bufsize: %d\n", bufsize); test_pagefault(mode, bufsize ); return 0; }