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