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 (const void *, const void *);
24
25 int
main(int argc,char * argv[])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(&ovfl, (size_t)n, sizeof(ovfl[0]), 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
col(const void * vx,const void * vy)101 col(
102 const void *vx,
103 const void *vy
104 )
105 {
106 const long *x = vx;
107 const long *y = vy;
108
109 return (*x - *y);
110 }
111