Actual source code: PetscMalloc.c


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

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

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

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

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

 34:   PetscCall(PetscTime(&x));

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

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

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

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

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