1c0b746e5SOllivier Robert /* 2c0b746e5SOllivier Robert * This program can be used to calibrate the clock reading jitter of a 3c0b746e5SOllivier Robert * particular CPU and operating system. It first tickles every element 4c0b746e5SOllivier Robert * of an array, in order to force pages into memory, then repeatedly calls 5c0b746e5SOllivier Robert * gettimeofday() and, finally, writes out the time values for later 6c0b746e5SOllivier Robert * analysis. From this you can determine the jitter and if the clock ever 7c0b746e5SOllivier Robert * runs backwards. 8c0b746e5SOllivier Robert */ 9224ba2bdSOllivier Robert 10c0b746e5SOllivier Robert #include <stdio.h> 11224ba2bdSOllivier Robert #include <sys/time.h> 12c0b746e5SOllivier Robert 13c0b746e5SOllivier Robert #define NBUF 20002 14c0b746e5SOllivier Robert 15c0b746e5SOllivier Robert int 16c0b746e5SOllivier Robert main( 17c0b746e5SOllivier Robert int argc, 18c0b746e5SOllivier Robert char *argv[] 19c0b746e5SOllivier Robert ) 20c0b746e5SOllivier Robert { 21c0b746e5SOllivier Robert struct timeval ts, tr; 22c0b746e5SOllivier Robert struct timezone tzp; 23c0b746e5SOllivier Robert long temp, j, i, gtod[NBUF]; 24c0b746e5SOllivier Robert 25c0b746e5SOllivier Robert gettimeofday(&ts, &tzp); 26c0b746e5SOllivier Robert 27c0b746e5SOllivier Robert /* 28c0b746e5SOllivier Robert * Force pages into memory 29c0b746e5SOllivier Robert */ 30c0b746e5SOllivier Robert for (i = 0; i < NBUF; i ++) 31c0b746e5SOllivier Robert gtod[i] = 0; 32c0b746e5SOllivier Robert 33c0b746e5SOllivier Robert /* 34c0b746e5SOllivier Robert * Construct gtod array 35c0b746e5SOllivier Robert */ 36c0b746e5SOllivier Robert for (i = 0; i < NBUF; i ++) { 37c0b746e5SOllivier Robert gettimeofday(&tr, &tzp); 38c0b746e5SOllivier Robert gtod[i] = (tr.tv_sec - ts.tv_sec) * 1000000 + tr.tv_usec; 39c0b746e5SOllivier Robert } 40c0b746e5SOllivier Robert 41c0b746e5SOllivier Robert /* 42c0b746e5SOllivier Robert * Write out gtod array for later processing with S 43c0b746e5SOllivier Robert */ 44c0b746e5SOllivier Robert for (i = 0; i < NBUF - 2; i++) { 45c0b746e5SOllivier Robert /* 46c0b746e5SOllivier Robert printf("%lu\n", gtod[i]); 47c0b746e5SOllivier Robert */ 48c0b746e5SOllivier Robert gtod[i] = gtod[i + 1] - gtod[i]; 49c0b746e5SOllivier Robert printf("%lu\n", gtod[i]); 50c0b746e5SOllivier Robert } 51c0b746e5SOllivier Robert 52c0b746e5SOllivier Robert /* 53c0b746e5SOllivier Robert * Sort the gtod array and display deciles 54c0b746e5SOllivier Robert */ 55c0b746e5SOllivier Robert for (i = 0; i < NBUF - 2; i++) { 56c0b746e5SOllivier Robert for (j = 0; j <= i; j++) { 57c0b746e5SOllivier Robert if (gtod[j] > gtod[i]) { 58c0b746e5SOllivier Robert temp = gtod[j]; 59c0b746e5SOllivier Robert gtod[j] = gtod[i]; 60c0b746e5SOllivier Robert gtod[i] = temp; 61c0b746e5SOllivier Robert } 62c0b746e5SOllivier Robert } 63c0b746e5SOllivier Robert } 64c0b746e5SOllivier Robert fprintf(stderr, "First rank\n"); 65c0b746e5SOllivier Robert for (i = 0; i < 10; i++) 66c0b746e5SOllivier Robert fprintf(stderr, "%10ld%10ld\n", i, gtod[i]); 67c0b746e5SOllivier Robert fprintf(stderr, "Last rank\n"); 68c0b746e5SOllivier Robert for (i = NBUF - 12; i < NBUF - 2; i++) 69c0b746e5SOllivier Robert fprintf(stderr, "%10ld%10ld\n", i, gtod[i]); 70c0b746e5SOllivier Robert exit(0); 71c0b746e5SOllivier Robert } 72