1 /* $NetBSD: hist.c,v 1.1.1.1 2009/12/13 16:57:28 kardel 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 (long *, long *); 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( 85 #ifdef QSORT_USES_VOID_P 86 (void *) 87 #else 88 (char *) 89 #endif 90 ovfl, (size_t)n, sizeof(long), col); 91 w = 0; 92 j = 0; 93 for (i = 0; i < n; i++) { 94 if (ovfl[i] != w) { 95 if (j > 0) 96 printf("%ld %ld\n", w, j); 97 w = ovfl[i]; 98 j = 1; 99 } else 100 j++; 101 } 102 if (j > 0) 103 printf("%ld %ld\n", w, j); 104 105 exit(0); 106 } 107 108 int 109 col( 110 long *x, 111 long *y 112 ) 113 { 114 return (*x - *y); 115 } 116