]> git.itanic.dy.fi Git - membench/blob - membench.c
Add missing fflush()
[membench] / membench.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/time.h>
4
5 #define lsize sizeof(unsigned long)
6
7 long usec_diff(const struct timeval *a, const struct timeval *b)
8 {
9         long usec_a, usec_b;
10         usec_a = a->tv_sec * 1000000 + a->tv_usec;
11         usec_b = b->tv_sec * 1000000 + b->tv_usec;
12         return usec_b - usec_a;
13 }
14
15 int main(int argc, char *argv[])
16 {
17         int iterations, j, k, count, size, mask, latcount;
18         unsigned long *buf, i, tmp = 0;
19         struct timeval start, end;
20
21         if (argc > 1)
22                 iterations = atoi(argv[1]);
23         else
24                 iterations = 24;
25
26         if (argc > 2)
27                 count = atoi(argv[2]);
28         else
29                 count = 1024;
30         latcount = count / 10;
31
32         printf("Doing %d runs with buffer size goin up to %dk\n",
33                iterations, 1 << (iterations - 10));
34         printf("Running each round %d times\n", count);
35         printf("Size of unsigned long is %lu bits\n\n", lsize * 8);
36
37         switch (lsize) {
38         case 4:
39                 j = 12;
40                 break;
41         case 8:
42                 j = 10;
43                 break;
44         default:
45                 printf("WTF?\n");
46                 exit(1);
47         }
48
49         printf("          |"
50                "         Read         |"
51                "         Write        |\n"
52                "          |"
53                "-----------------------"
54                "-----------------------\n"
55                "    Size  |"
56                "    MiB/s         ns  |"
57                "    MiB/s         ns  |\n"
58                "----------|"
59                "-----------------------"
60                "-----------------------\n"
61                 );
62
63         for (; j < iterations + 1; j++) {
64                 size = (1 << j) / lsize;
65                 buf = malloc(size * lsize);
66                 mask = size - 1;
67
68                 if (buf == NULL) {
69                         printf("Malloc failed\n");
70                         exit(1);
71                 }
72
73                 /* Touch the pages */
74                 for (i = 0; i < size; i++)
75                         buf[i] = i;
76
77                 printf("%8luk |", size * lsize / 1024);
78
79                 /* Read bandwidth*/
80
81                 fflush(stdout);
82
83                 gettimeofday(&start, 0);
84                 for (k = 0; k < count; k++) {
85                         buf[0] = tmp;
86                         for (i = 0; i < size; i++)
87                                 tmp += buf[i];
88                 }
89
90                 gettimeofday(&end, 0);
91
92                 printf("% 9.2f  ", (double)(size * lsize) * 
93                        (1000000 / (1024.0 * 1024.0)) * count / 
94                        (double) usec_diff(&start, &end));
95
96                 fflush(stdout);
97
98                 /* Read latency */
99
100                 gettimeofday(&start, 0);
101                 for (k = 0; k < latcount; k++) {
102                         buf[0] = tmp;
103                         for (i = 0; i < size; i++)
104                                 tmp += buf[random() & mask];
105                 }
106
107                 gettimeofday(&end, 0);
108
109                 printf("% 9.3f  |", usec_diff(&start, &end) * 1000 / 
110                        ((double) (size * latcount )));
111
112
113                 fflush(stdout);
114
115                 /* Write bandwidth */
116
117                 gettimeofday(&start, 0);
118                 for (k = 0; k < count; k++)
119                         for (i = 0; i < size; i++)
120                                  buf[i] = i;
121                 gettimeofday(&end, 0);
122
123                 printf("% 9.2f  ", (double)(size * lsize) * 
124                        (1000000 / (1024.0 * 1024.0)) * count / 
125                        (double) usec_diff(&start, &end));
126         
127                 fflush(stdout);
128
129                 /* Write latency */
130
131                 gettimeofday(&start, 0);
132                 for (k = 0; k < latcount; k++)
133                         for (i = 0; i < size; i++)
134                                 buf[random() % mask] = i;
135                 gettimeofday(&end, 0);
136
137                 printf("% 9.3f  |", usec_diff(&start, &end) * 1000 / 
138                        ((double) (size * latcount )));
139         
140                 printf("\n");
141
142                 free(buf);
143         }
144         return 0;
145 }