我不知道这段代码究竟是什么:
int rdtsc(){
__asm__ __volatile__("rdtsc");
拜托,有人可以解释一下吗?为什么“rdtsc”?
答案 0 :(得分:6)
实际上,根本不是很好的代码。
RDTSC
是x86指令" ReaD TimeStamp Counter" - 它读取一个64位计数器,在处理器的每个时钟周期计数。
但由于它是64位数字,它存储在EAX
(低部分)和EDX
(高部分)中,并且如果此代码曾被用于在内联的情况下,编译器不知道EDX
正在被破坏。或者内联程序集在从非void
函数结束之前设置EAX。
编译器没有理解"汇编程序代码,它是一个黑盒子,你必须用输入/输出操作数描述它,所以它知道EDX:EAX
中有一个输出。 (或EAX
中的输出EDX
被破坏)。我会这样做:
uint64_t rdtsc()
{
uint32_t hi, lo;
__asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
return ( (uint64_t)lo)|( ((uint64_t)hi)<<32 );
}
因此给出了一个时间计数,它不会在现代机器上每隔一两秒回绕一次,并告诉编译器注册了asm
语句修改的内容。
或者使用__rdtsc()
内在函数让编译器自己发出rdtsc
指令,并知道输出的位置。请参阅Get CPU cycle count?。
答案 1 :(得分:4)
rdtsc
经常引用的内联汇编产生supeflous code with gcc-7 and earlier versions。
更有效的解决方案是使用__builtin_ia32_rdtsc
内置函数:
uint64_t tsc = __builtin_ia32_rdtsc();