すべてのプロセッサのプロセッサ名に MHz が記入されているわけではないので、このように gettimeofday() と rdtsc() を用いて動作周波数を計算する関数を書いてみた。
double get_heuristic_mfreq(void) {
unsigned long a, d;
unsigned long ts1, ts2, td1, td2;
struct timeval tv;
/* heuristic detection */
gettimeofday(&tv, NULL);
td1 = (unsigned long)tv.tv_sec*1000000 + tv.tv_usec;
__asm__ __volatile__ ("rdtsc" : "=a" (a), "=d" (d));
ts1 = a | (d << 32);
usleep(50000); /* 50 msec. */
__asm__ __volatile__ ("rdtsc" : "=a" (a), "=d" (d));
ts2 = a | (d << 32);
gettimeofday(&tv, NULL);
td2 = (unsigned long)tv.tv_sec*1000000 + tv.tv_usec;
/* heuristic detection */
return (double)(ts2-ts1) / (td2-td1);
}