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