5 #include <sys/sysctl.h>
7 long long cpucycles_x86estimate(void)
10 asm volatile(".byte 15;.byte 49" : "=A" (result
));
14 static long long microseconds(void)
17 gettimeofday(&t
,(struct timezone
*) 0);
18 return t
.tv_sec
* (long long) 1000000 + t
.tv_usec
;
21 static double guessfreq(void)
23 long long tb0
; long long us0
;
24 long long tb1
; long long us1
;
26 tb0
= cpucycles_x86estimate();
29 tb1
= cpucycles_x86estimate();
31 } while (us1
- us0
< 10000 || tb1
- tb0
< 1000);
32 if (tb1
<= tb0
) return 0;
35 return ((double) tb1
) / (0.000001 * (double) us1
);
38 static double cpufrequency
= 0;
40 static void init(void)
46 for (loop
= 0;loop
< 100;++loop
) {
49 if (guess1
> 1.01 * guess2
) continue;
50 if (guess2
> 1.01 * guess1
) continue;
51 cpufrequency
= 0.5 * (guess1
+ guess2
);
56 long long cpucycles_x86estimate_persecond(void)
58 if (!cpufrequency
) init();