#include #include #include #include static inline uint64_t rdtsc(void) { uint64_t rv; __asm __volatile("rdtsc" : "=A" (rv)); return (rv); } int main(int argc, char *argv[]) { uint64_t begin, end, sum = 0, used = 0, unused = 0; int i, min = (1<<30)-1, max = 0, diff, avg; printf("Estimating interval "); for (i = 0; i < 101; ++i) { begin = rdtsc(); usleep(1); end = rdtsc(); if (i > 0) { diff = end - begin; if (diff > max) max = diff; if (diff < min) min = diff; sum += diff; } } avg = sum / 100; printf(" min %d max %d avg %d\n", min, max, avg); i = 0; for (;;) { begin = rdtsc(); if ((++i % 500) == 0) { printf("Using about %d%% of the CPU\r", (int)(used * 100 / (used + unused))); fflush(stdout); } end = begin + avg * 15 / 100; while (rdtsc() < end) ; end = rdtsc(); used += end - begin; begin = end; usleep(1); end = rdtsc(); unused += end - begin; } return (0); }