#include #include int main( int argc, const char *const* argv ) { unsigned long tsc_lo, tsc_hi, tsc_cpu; int cnt=10; unsigned long sample[10], s=0, last_tsc=0; do_it: (tsc_lo = tsc_hi =0, tsc_cpu=~0); asm volatile ( "rdtscp" : "=a" (tsc_lo) , "=d" (tsc_hi) , "=c" (tsc_cpu) ); register unsigned long tsc=(((tsc_hi & 0xffffffffUL) << 32U)|(tsc_lo & 0xffffffffUL)); if( last_tsc > 0 ) { sample [ s ] = tsc - last_tsc ; s+=1; } last_tsc = tsc; if( cnt-- > 0 ) goto do_it; // TSC clocksource calibration: 2893.300 MHz // 2.8933Ghz: so there are 1/0.28933 = 3.45626 ticks per nanosecond: double sum=0; for(s=1; s < 9; s+=1) { sum += ((double)sample[s]) / 3.45626; printf("%lu\n",lround(((double)sample[s])/3.45626)); } printf("sum : %e nanoseconds avg: %lu\n",sum,lround(sum) >> 3); return 0; }