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