Expand PMF_FN_* macros.
[netbsd-mini2440.git] / dist / ntp / util / hist.c
blobd625c4fc8a318f78accc664326803594735fe0f0
1 /* $NetBSD: hist.c,v 1.2 2003/12/04 16:23:38 drochner Exp $ */
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.
12 #ifdef HAVE_CONFIG_H
13 # include <config.h>
14 #endif
16 #include "ntp_types.h"
18 #include <stdio.h>
19 #include <stdlib.h>
21 #define NBUF 100001 /* size of basic histogram */
22 #define NSRT 20000 /* size of overflow histogram */
23 #define NCNT (600 * 1000000) /* sample interval (us) */
25 int col P((long *, long *));
27 int
28 main(
29 int argc,
30 char *argv[]
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];
39 * Force pages into memory
41 for (i = 0; i < NBUF; i++)
42 gtod[i] = 0;
43 for (i = 0; i < NSRT; i++)
44 ovfl[i] = 0;
47 * Construct histogram
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) {
61 printf("error <= 0 %ld %d %d, %d %d\n", w, ts.tv_sec,
62 ts.tv_usec, tr.tv_sec, tr.tv_usec);
64 } else if (w > NBUF - 1) {
65 ovfl[n] = w;
66 if (n < NSRT - 1)
67 n++;
68 } else {
69 gtod[w]++;
71 ts = tr;
72 t = u;
76 * Write out histogram
78 for (i = 0; i < NBUF - 1; i++) {
79 if (gtod[i] > 0)
80 printf("%ld %ld\n", i, gtod[i]);
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++;
102 if (j > 0)
103 printf("%ld %ld\n", w, j);
105 exit(0);
109 col(
110 long *x,
111 long *y
114 return (*x - *y);