10

取自这个 SO 线程,这段代码计算了运行代码在行//1和之间经过的 CPU 周期数//2

$ 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()工作?

4

1 回答 1

11

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

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

时间戳计数器是一个 64 位寄存器,自 Pentium 以来所有 x86 处理器都存在。它计算自重置以来的刻度数。指令 RDTSC 在 EDX:EAX 中返回 TSC。它的操作码是 0F 31.[1] 奔腾的竞争对手,如 Cyrix 6x86 并不总是有 TSC,可能会认为 RDTSC 是非法指令。Cyrix 在他们的 MII 中包含了一个时间戳计数器。

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

于 2010-10-09T22:28:38.240 回答