Change the default for ntpd back to -s, the bug which triggered this
[dragonfly.git] / contrib / ntp / util / hist.c
1 /*
2  * This program can be used to calibrate the clock reading jitter of a
3  * particular CPU and operating system. It first tickles every element
4  * of an array, in order to force pages into memory, then repeatedly calls
5  * gettimeofday() and, finally, writes out the time values for later
6  * analysis. From this you can determine the jitter and if the clock ever
7  * runs backwards.
8  */
9
10 #ifdef HAVE_CONFIG_H
11 # include <config.h>
12 #endif
13
14 #include "ntp_types.h"
15
16 #include <stdio.h>
17 #include <stdlib.h>
18
19 #define NBUF 100001             /* size of basic histogram */
20 #define NSRT 20000              /* size of overflow histogram */
21 #define NCNT (600 * 1000000)    /* sample interval (us) */
22
23 int col P((long *, long *));
24
25 int
26 main(
27         int argc,
28         char *argv[]
29         )
30 {
31         struct timeval ts, tr, tp;
32         struct timezone tzp;
33         int i, j, n;
34         long t, u, v, w, gtod[NBUF], ovfl[NSRT];
35
36         /*
37          * Force pages into memory
38          */
39         for (i = 0; i < NBUF; i++)
40             gtod[i] = 0;
41         for (i = 0; i < NSRT; i++)
42             ovfl[i] = 0;
43
44         /*
45          * Construct histogram
46          */
47         n = 0;
48         gettimeofday(&ts, &tzp);
49         t = ts.tv_sec * 1000000 + ts.tv_usec;
50         v = t;
51         while (1) {
52                 gettimeofday(&tr, &tzp);
53                 u = tr.tv_sec * 1000000 + tr.tv_usec; 
54                 if (u - v > NCNT)
55                     break;
56                 w = u - t;
57                 if (w <= 0) {
58 /*
59                         printf("error <= 0 %ld %d %d, %d %d\n", w, ts.tv_sec,
60                                ts.tv_usec, tr.tv_sec, tr.tv_usec);
61 */
62                 } else if (w > NBUF - 1) {
63                         ovfl[n] = w;
64                         if (n < NSRT - 1)
65                             n++;
66                 } else {
67                         gtod[w]++;
68                 }
69                 ts = tr;
70                 t = u;
71         }
72
73         /*
74          * Write out histogram
75          */
76         for (i = 0; i < NBUF - 1; i++) {
77                 if (gtod[i] > 0)
78                     printf("%ld %ld\n", i, gtod[i]);
79         }
80         if (n == 0)
81             return;
82         qsort((char *)ovfl, (size_t)n, sizeof(long), col);
83         w = 0;
84         j = 0;
85         for (i = 0; i < n; i++) {
86                 if (ovfl[i] != w) {
87                         if (j > 0)
88                             printf("%ld %ld\n", w, j);
89                         w = ovfl[i];
90                         j = 1;
91                 } else
92                     j++;
93         }
94         if (j > 0)
95             printf("%ld %ld\n", w, j);
96  
97         exit(0);
98 }
99
100 int
101 col(
102         long *x,
103         long *y
104         )
105 {
106         return (*x - *y);
107 }