memtest.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <ndb_global.h>
  14. long long getMilli();
  15. long long getMicro();
  16. void malloctest(int loopcount, int memsize, int touch);
  17. void freetest(int loopcount, int memsize);
  18. void mmaptest(int loopcount, int memsize, int touch);
  19. void unmaptest(int loopcount, int memsize);
  20. main(int argc, char ** argv)
  21. {
  22.   int loopcount;
  23.   int memsize;
  24.   if(argc < 4) {
  25.     printf("Usage:  memtest X loopcount memsize(MB)n");
  26.     printf("where X = n");
  27.     printf("1 : malloc test n");
  28.     printf("2 : mmap test n");
  29.     printf("3 : malloc test + touch pagesn");
  30.     printf("4 : mmap test + touch pagesn");
  31.     printf("5 : malloc/free test n");
  32.     printf("6 : mmap/munmap test n");
  33.     printf("loopcount - number of loopsn");
  34.     printf("memsize - memory segment size to allocate in MB.n");
  35.     exit(1);
  36.   }
  37.   
  38.   loopcount = atoi(argv[2]);
  39.   memsize = atoi(argv[3]);
  40.   switch(atoi(argv[1])) {
  41.   case 1: malloctest(loopcount, memsize , 0 );
  42.     break;
  43.   case 2: mmaptest(loopcount, memsize,0);
  44.     break;
  45.   case 3: malloctest(loopcount, memsize,1);
  46.     break;
  47.   case 4: mmaptest(loopcount, memsize,1);
  48.     break;
  49.   case 5: freetest(loopcount, memsize);
  50.     break;
  51.   case 6: unmaptest(loopcount, memsize);
  52.     break;
  53.   default:
  54.     break;
  55.   }
  56. }
  57.   
  58. long long getMilli() {
  59.   struct timeval tick_time;
  60.   gettimeofday(&tick_time, 0);
  61.   return 
  62.     ((long long)tick_time.tv_sec)  * ((long long)1000) +
  63.     ((long long)tick_time.tv_usec) / ((long long)1000);
  64. }
  65. long long getMicro(){
  66.   struct timeval tick_time;
  67.   int res = gettimeofday(&tick_time, 0);
  68.   long long secs   = tick_time.tv_sec;
  69.   long long micros = tick_time.tv_usec;
  70.   
  71.   micros = secs*1000000+micros;
  72.   return micros;
  73. }
  74. void malloctest(int loopcount, int memsize, int touch) {
  75.   long long start=0;
  76.   int total=0;
  77.   int i=0, j=0;
  78.   int size=memsize*1024*1024; /*bytes*/;
  79.   float mean;
  80.   char * ptr =0;
  81.   
  82.   printf("Staring malloctest ");
  83.   if(touch)
  84.     printf("with touchn");
  85.   else
  86.     printf("n");
  87.   
  88.   start=getMicro();
  89.   
  90.   for(i=0; i<loopcount; i++){
  91.     ptr=(char *)malloc((size_t)(size));
  92.     if(ptr==0) {
  93.       printf("failed to malloc!n");
  94.       return;
  95.     }    
  96.     if(touch) {
  97.       for(j=0; j<size; j=j+4096)
  98. ptr[j]=1;
  99.     }
  100.   }
  101.   total=(int)(getMicro()-start);
  102.   
  103.   mean=(float)((float)total/(float)loopcount);
  104.   printf("Total time malloc %d bytes: %2.3f microsecs  loopcount %d touch %d n",
  105.  size, mean,loopcount, touch);  
  106. }
  107. void mmaptest(int loopcount, int memsize, int touch) {
  108.   long long start=0;
  109.   int total=0;
  110.   int i=0, j=0;
  111.   char * ptr;
  112.   int size=memsize*1024*1024; /*bytes*/;
  113.   float mean;
  114.   printf("Staring mmaptest ");
  115.   if(touch)
  116.     printf("with touch n");
  117.   else
  118.     printf("n");
  119.   start=getMicro();  
  120.   for(i=0; i<loopcount; i++){
  121.     ptr = mmap(0, 
  122.        size, 
  123.        PROT_READ|PROT_WRITE, 
  124.        MAP_PRIVATE|MAP_ANONYMOUS, 
  125.        0,
  126.        0);
  127.     if(ptr<0) {
  128.       printf("failed to mmap!n");
  129.       return;
  130.     }
  131.     if(touch) {
  132.       for(j=0; j<size; j=j+4096)
  133. ptr[j]=1;
  134.     }  
  135.   }
  136.   total=(int)(getMicro()-start);
  137.   mean=(float)((float)total/(float)loopcount);
  138.   printf("Total time mmap %d bytes: %2.3f microsecs  n",size, mean);  
  139. }
  140. void unmaptest(loopcount, memsize) 
  141. {
  142.   long long start=0;
  143.   int total=0;
  144.   int i=0, j=0;
  145.   char * ptr;
  146.   int size=memsize*1024*1024; /*bytes*/;
  147.   float mean;
  148.   printf("Staring munmap test (loopcount = 1 no matter what you prev. set)n");
  149.   loopcount = 1;
  150.   for(i=0; i<loopcount; i++){
  151.     ptr =(char*) mmap(0, 
  152.       size, 
  153.       PROT_READ|PROT_WRITE, 
  154.       MAP_PRIVATE|MAP_ANONYMOUS, 
  155.       0,
  156.       0);
  157.     if(ptr<0) {
  158.       printf("failed to mmap!n");
  159.       return;
  160.     }
  161.     for(j=0; j<size; j=j+1)
  162.       ptr[j]='1';
  163.     start=getMicro(); 
  164.     if(munmap(ptr, size)<0) {
  165.       printf("failed to munmap!n");
  166.       return;
  167.     }
  168.    
  169.     total=(int)(getMicro()-start);
  170.     /*
  171.     for(j=8192; j<size; j=j+4096) {
  172. *(ptr+j)='1';
  173.     }
  174.     
  175.     for(j=0; j<4096; j=j+4096) { 
  176.       *(ptr+j)='1';
  177.     }
  178.     
  179.     */
  180.   }
  181.   mean=(float)((float)total/(float)loopcount);
  182.   printf("Total time unmap %d bytes: %2.3f microsecs  n",size, mean);  
  183. }
  184. void freetest(int loopcount, int memsize) {
  185.   long long start=0;
  186.   int total=0;
  187.   int i=0, j=0;
  188.   int size=memsize*1024*1024; /*bytes*/;
  189.   float mean;
  190.   char * ptr =0;
  191.   loopcount = 1;
  192.   printf("Staring free test (loopcount = 1 no matter what you prev. set)n");
  193.   
  194.   for(i=0; i<loopcount; i++){
  195.     ptr=(char*)malloc((size_t)(size));
  196.     if(ptr==0) {
  197.       printf("failed to malloc!n");
  198.       return;
  199.     }
  200.     for(j=0; j<size; j=j+4096)
  201.       ptr[j]='1';
  202.     start=getMicro();     
  203.     free(ptr);
  204.     total=(int)(getMicro()-start);
  205.   }
  206.   
  207.   mean=(float)((float)total/(float)loopcount);
  208.   printf("Total time free %d bytes: %2.3f microsecs  loopcount %d n",
  209.  size, mean,loopcount);  
  210. }