xref: /petsc/src/benchmarks/PetscMalloc.c (revision 5b6bfdb9644f185dbf5e5a09b808ec241507e1e7)
1 
2 #include <petscsys.h>
3 #include <petsctime.h>
4 
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   PetscErrorCode ierr;
12   PetscRandom    r;
13   PetscBool      flg;
14 
15   ierr = PetscInitialize(&argc,&argv,0,0);if (ierr) return ierr;
16   ierr = PetscRandomCreate(PETSC_COMM_SELF,&r);CHKERRQ(ierr);
17   ierr = PetscRandomSetFromOptions(r);CHKERRQ(ierr);
18   for (i=0; i<1000; i++) {
19     ierr     = PetscRandomGetValue(r,&value);CHKERRQ(ierr);
20     rand1[i] = (int)(value* 144327);
21     ierr     = PetscRandomGetValue(r,&value);CHKERRQ(ierr);
22     rand2[i] = (int)(value* 144327);
23   }
24 
25   /* Take care of paging effects */
26   ierr = PetscMalloc1(100,&dummy);CHKERRQ(ierr);
27   ierr = PetscFree(dummy);CHKERRQ(ierr);
28   ierr = PetscTime(&x);CHKERRQ(ierr);
29 
30   /* Do all mallocs */
31   for (i=0; i< 1000; i++) {
32     ierr = PetscMalloc1(rand1[i],&arr[i]);CHKERRQ(ierr);
33   }
34 
35   ierr = PetscTime(&x);CHKERRQ(ierr);
36 
37   /* Do some frees */
38   for (i=0; i< 1000; i+=2) {
39     ierr = PetscFree(arr[i]);CHKERRQ(ierr);
40   }
41 
42   /* Do some mallocs */
43   for (i=0; i< 1000; i+=2) {
44     ierr = PetscMalloc1(rand2[i],&arr[i]);CHKERRQ(ierr);
45   }
46   ierr = PetscTime(&y);CHKERRQ(ierr);
47 
48   for (i=0; i< 1000; i++) {
49     ierr = PetscFree(arr[i]);CHKERRQ(ierr);
50   }
51 
52   fprintf(stdout,"%-15s : %e sec, with options : ","PetscMalloc",(y-x)/500.0);
53   ierr = PetscOptionsHasName(NULL,"-malloc",&flg);CHKERRQ(ierr);
54   if (flg) fprintf(stdout,"-malloc ");
55   fprintf(stdout,"\n");
56 
57   ierr = PetscRandomDestroy(&r);CHKERRQ(ierr);
58   ierr = PetscFinalize();
59   return ierr;
60 }
61