TSC
wiki上的说明:http://en.wikipedia.org/wiki/Time_Stamp_Counter
intel 有的CPU tsc的变化是固定的(不会随 cpu节电的影响)。
判断CPU是否支持常量TSC,可以使用 “cat /proc/cpuinfo | grep constant_tsc“, 有输出就表示支持。
下面是tsc的读取代码, cpuid是为了解决CPU乱序执行的问题。
GNU C++
#include <stdint.h>
extern "C" {
__inline__ uint64_t rdtsc() {
uint32_t lo, hi;
__asm__ __volatile__ ( // serialize
"xorl %%eax,%%eax \n cpuid"
::: "%rax", "%rbx", "%rcx", "%rdx");
/* We cannot use "=A", since this would use %rax on x86_64 */
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
return (uint64_t)hi << 32 | lo;
}
}
POSIX 调用 clock_gettime
Microsoft Visual C++
__declspec(naked)
unsigned __int64 __cdecl rdtsc(void)
{
__asm
{
rdtsc
ret ; return value at EDX:EAX
}
}
Windows API QueryPerformanceCounter, QueryPerformanceFrequency

浙公网安备 33010602011771号