diff options
Diffstat (limited to 'storage/ndb/src/common/portlib/memtest.c')
-rw-r--r-- | storage/ndb/src/common/portlib/memtest.c | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/storage/ndb/src/common/portlib/memtest.c b/storage/ndb/src/common/portlib/memtest.c new file mode 100644 index 00000000000..673f23fa803 --- /dev/null +++ b/storage/ndb/src/common/portlib/memtest.c @@ -0,0 +1,243 @@ +/* Copyright (C) 2003 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + + + +#include <ndb_global.h> + +long long getMilli(); +long long getMicro(); +void malloctest(int loopcount, int memsize, int touch); +void freetest(int loopcount, int memsize); +void mmaptest(int loopcount, int memsize, int touch); +void unmaptest(int loopcount, int memsize); + + +main(int argc, char ** argv) +{ + + int loopcount; + int memsize; + if(argc < 4) { + printf("Usage: memtest X loopcount memsize(MB)\n"); + printf("where X = \n"); + printf("1 : malloc test \n"); + printf("2 : mmap test \n"); + printf("3 : malloc test + touch pages\n"); + printf("4 : mmap test + touch pages\n"); + printf("5 : malloc/free test \n"); + printf("6 : mmap/munmap test \n"); + printf("loopcount - number of loops\n"); + printf("memsize - memory segment size to allocate in MB.\n"); + exit(1); + } + + + loopcount = atoi(argv[2]); + memsize = atoi(argv[3]); + switch(atoi(argv[1])) { + case 1: malloctest(loopcount, memsize , 0 ); + break; + case 2: mmaptest(loopcount, memsize,0); + break; + case 3: malloctest(loopcount, memsize,1); + break; + case 4: mmaptest(loopcount, memsize,1); + break; + case 5: freetest(loopcount, memsize); + break; + case 6: unmaptest(loopcount, memsize); + break; + default: + break; + } +} + +long long getMilli() { + struct timeval tick_time; + gettimeofday(&tick_time, 0); + + return + ((long long)tick_time.tv_sec) * ((long long)1000) + + ((long long)tick_time.tv_usec) / ((long long)1000); +} + +long long getMicro(){ + struct timeval tick_time; + int res = gettimeofday(&tick_time, 0); + + long long secs = tick_time.tv_sec; + long long micros = tick_time.tv_usec; + + micros = secs*1000000+micros; + return micros; +} + +void malloctest(int loopcount, int memsize, int touch) { + long long start=0; + int total=0; + int i=0, j=0; + int size=memsize*1024*1024; /*bytes*/; + float mean; + char * ptr =0; + + printf("Staring malloctest "); + if(touch) + printf("with touch\n"); + else + printf("\n"); + + start=getMicro(); + + for(i=0; i<loopcount; i++){ + ptr=(char *)malloc((size_t)(size)); + if(ptr==0) { + printf("failed to malloc!\n"); + return; + } + if(touch) { + for(j=0; j<size; j=j+4096) + ptr[j]=1; + } + } + total=(int)(getMicro()-start); + + mean=(float)((float)total/(float)loopcount); + printf("Total time malloc %d bytes: %2.3f microsecs loopcount %d touch %d \n", + size, mean,loopcount, touch); +} + + +void mmaptest(int loopcount, int memsize, int touch) { + long long start=0; + int total=0; + int i=0, j=0; + char * ptr; + int size=memsize*1024*1024; /*bytes*/; + float mean; + + printf("Staring mmaptest "); + if(touch) + printf("with touch \n"); + else + printf("\n"); + + start=getMicro(); + for(i=0; i<loopcount; i++){ + ptr = mmap(0, + size, + PROT_READ|PROT_WRITE, + MAP_PRIVATE|MAP_ANONYMOUS, + 0, + 0); + if(ptr<0) { + printf("failed to mmap!\n"); + return; + } + + if(touch) { + for(j=0; j<size; j=j+4096) + ptr[j]=1; + } + } + total=(int)(getMicro()-start); + mean=(float)((float)total/(float)loopcount); + printf("Total time mmap %d bytes: %2.3f microsecs \n",size, mean); +} + + +void unmaptest(loopcount, memsize) +{ + long long start=0; + int total=0; + int i=0, j=0; + char * ptr; + int size=memsize*1024*1024; /*bytes*/; + float mean; + + printf("Staring munmap test (loopcount = 1 no matter what you prev. set)\n"); + + loopcount = 1; + + + for(i=0; i<loopcount; i++){ + ptr =(char*) mmap(0, + size, + PROT_READ|PROT_WRITE, + MAP_PRIVATE|MAP_ANONYMOUS, + 0, + 0); + if(ptr<0) { + printf("failed to mmap!\n"); + return; + } + + + for(j=0; j<size; j=j+1) + ptr[j]='1'; + start=getMicro(); + if(munmap(ptr, size)<0) { + printf("failed to munmap!\n"); + return; + } + + total=(int)(getMicro()-start); + /* + for(j=8192; j<size; j=j+4096) { + + *(ptr+j)='1'; + } + + for(j=0; j<4096; j=j+4096) { + *(ptr+j)='1'; + } + + */ + } + mean=(float)((float)total/(float)loopcount); + printf("Total time unmap %d bytes: %2.3f microsecs \n",size, mean); +} + +void freetest(int loopcount, int memsize) { + long long start=0; + int total=0; + int i=0, j=0; + int size=memsize*1024*1024; /*bytes*/; + float mean; + char * ptr =0; + + loopcount = 1; + printf("Staring free test (loopcount = 1 no matter what you prev. set)\n"); + + + for(i=0; i<loopcount; i++){ + ptr=(char*)malloc((size_t)(size)); + if(ptr==0) { + printf("failed to malloc!\n"); + return; + } + for(j=0; j<size; j=j+4096) + ptr[j]='1'; + start=getMicro(); + free(ptr); + total=(int)(getMicro()-start); + } + + + mean=(float)((float)total/(float)loopcount); + printf("Total time free %d bytes: %2.3f microsecs loopcount %d \n", + size, mean,loopcount); +} |