该代码如何计算经过的CPU周期数?

从这个SO线程中获取 ,这段代码计算在//1//2行之间运行代码所经过的CPU周期数。

 $ cat cyc.c #include static __inline__ unsigned long long rdtsc(void) { unsigned long long int x; __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); return x; } int main() { unsigned long long cycles = rdtsc(); //1 cycles = rdtsc() - cycles; //2 printf("Time is %d\n", (unsigned)cycles); return 0; } $ gcc cyc.c -o cyc $ ./cyc Time is 73 $ ./cyc Time is 74 $ ./cyc Time is 63 $ ./cyc Time is 73 $ 

rdtsc()函数如何工作?

该函数执行x86指令RTDSC,其恰好具有0x0f, 0x31的操作码。 处理器在内部跟踪时钟周期,并读取该数字。

当然,这仅适用于x86 procs,其他处理器则需要不同的指令。

自Pentium以来,时间戳计数器是所有x86处理器上的64位寄存器。 它计算自重置后的滴答数。 指令RDTSC在EDX:EAX中返回TSC。 它的操作码是0F 31. [1] 诸如Cyrix 6×86之类的奔腾竞争对手并不总是拥有TSC,并且可能认为RDTSC是非法指令。 Cyrix在其MII中包含一个时间戳计数器。

http://en.wikipedia.org/wiki/Time_Stamp_Counter