Actual source code: PetscMalloc.c

  1: #include <petscsys.h>
  2: #include <petsctime.h>

  4: int main(int argc,char **argv)
  5: {
  6:   PetscLogDouble x,y;
  7:   double         value;
  8:   void           *arr[1000],*dummy;
  9:   int            i,rand1[1000],rand2[1000];
 10:   PetscRandom    r;
 11:   PetscBool      flg;

 13:   PetscCall(PetscInitialize(&argc,&argv,0,0));
 14:   PetscCall(PetscRandomCreate(PETSC_COMM_SELF,&r));
 15:   PetscCall(PetscRandomSetFromOptions(r));
 16:   for (i=0; i<1000; i++) {
 17:     PetscCall(PetscRandomGetValue(r,&value));
 18:     rand1[i] = (int)(value* 144327);
 19:     PetscCall(PetscRandomGetValue(r,&value));
 20:     rand2[i] = (int)(value* 144327);
 21:   }

 23:   /* Take care of paging effects */
 24:   PetscCall(PetscMalloc1(100,&dummy));
 25:   PetscCall(PetscFree(dummy));
 26:   PetscCall(PetscTime(&x));

 28:   /* Do all mallocs */
 29:   for (i=0; i< 1000; i++) {
 30:     PetscCall(PetscMalloc1(rand1[i],&arr[i]));
 31:   }

 33:   PetscCall(PetscTime(&x));

 35:   /* Do some frees */
 36:   for (i=0; i< 1000; i+=2) {
 37:     PetscCall(PetscFree(arr[i]));
 38:   }

 40:   /* Do some mallocs */
 41:   for (i=0; i< 1000; i+=2) {
 42:     PetscCall(PetscMalloc1(rand2[i],&arr[i]));
 43:   }
 44:   PetscCall(PetscTime(&y));

 46:   for (i=0; i< 1000; i++) {
 47:     PetscCall(PetscFree(arr[i]));
 48:   }

 50:   fprintf(stdout,"%-15s : %e sec, with options : ","PetscMalloc",(y-x)/500.0);
 51:   PetscCall(PetscOptionsHasName(NULL,"-malloc",&flg));
 52:   if (flg) fprintf(stdout,"-malloc ");
 53:   fprintf(stdout,"\n");

 55:   PetscCall(PetscRandomDestroy(&r));
 56:   PetscCall(PetscFinalize());
 57:   return 0;
 58: }