从this SO thread获取,这段代码计算在行//1
和//2
之间运行代码所经过的CPU周期数。
$ cat cyc.c
#include<stdio.h>
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()
功能如何运作?
答案 0 :(得分:11)
该函数执行x86指令RTDSC,其恰好具有0x0f, 0x31
的操作码。处理器在内部跟踪时钟周期,并读取该数字。
当然,这只适用于x86触发器,其他处理器需要不同的指令。
自Pentium以来,时间戳计数器是所有x86处理器上的64位寄存器。它计算自重置以来的滴答数。指令RDTSC在EDX:EAX中返回TSC。它的操作码是0F 31. [1]诸如Cyrix 6x86之类的奔腾竞争对手并不总是拥有TSC,并且可能认为RDTSC是非法指令。 Cyrix在其信息产业部中包括一个时间戳计数器。