11 static inline uint64_t rdtsc(void) {
13 asm volatile ("rdtsc" : "=a" (lo), "=d" (hi));
14 return ((uint64_t)hi << 32) | lo;
17 void int_handler(int sig)
22 static double cpu_mhz;
28 f = fopen("/proc/cpuinfo", "r");
30 perror("/proc/cpuinfo");
33 while (fgets(line, sizeof(line), f)) {
34 if (strncmp(line, "cpu MHz", 7) == 0) {
36 int ret = sscanf(line, "cpu MHz : %lf", &mhz);
38 fprintf(stderr, "Can't read cpu Mhz\n");
42 printf("CPU frequency: %.0lf MHz\n", cpu_mhz);
49 #define CLOCK_TO_SEC(clock) ((double)(clock)/(cpu_mhz*1000.0*1000.0))
53 struct timespec ts = { .tv_sec = 0, .tv_nsec = 10*1000*1000 };
54 /* uint64_t start, end; */
56 long long difference, max_difference = 0;
57 struct timespec start, end;
59 clock_gettime(CLOCK_MONOTONIC, &start);
61 clock_gettime(CLOCK_MONOTONIC, &end);
62 duration = timespec_sub_usec(&end, &start);
63 difference = duration - ts.tv_nsec/1000;
64 if (difference > max_difference) {
65 max_difference = difference;
66 printf("%lld usec\n", max_difference);
71 int main(int argc, char *argv[])
73 struct sigaction act = {
74 .sa_handler = int_handler
78 sigaction(SIGINT, &act, NULL);