如何獲得高精度的CPU時間
阿新 • • 發佈:2019-02-01
很多時候,我們想要統計一段程式碼執行的時間,但是這段程式碼執行的時間很短很短,以至於用clock()等函式獲得時間的方法幾乎是無效的。
那麼我們該粗和獲得高時間呢?
很多Intel的CPU有一條獲得系統時鐘的指令。我們可以用這條指令來獲得時間。
rdtsc.h
用法:#if defined(__i386__) static __inline__ unsigned long long rdtsc(void) { unsigned long long int x; __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); return x; } #elif defined(__x86_64__) static __inline__ unsigned long long rdtsc(void) { unsigned hi, lo; __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi)); return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 ); } #elif defined(__powerpc__) static __inline__ unsigned long long rdtsc(void) { unsigned long long int result=0; unsigned long int upper, lower,tmp; __asm__ volatile( "0: \n" "\tmftbu %0 \n" "\tmftb %1 \n" "\tmftbu %2 \n" "\tcmpw %2,%0 \n" "\tbne 0b \n" : "=r"(upper),"=r"(lower),"=r"(tmp) ); result = upper; result = result<<32; result = result|lower; return(result); } #endif
#include <stdio.h>
#include "rdtsc.h"
int main(int argc, char* argv[])
{
unsigned long long a,b;
start_time = rdtsc();
//do something...
end_time = rdtsc();
printf("%llu\n", end_time-start_time);
return 0;
}
有了這個超高精度的時間函式,以後應用中對效率的比較會更準確。《程式設計之美》中正是用這種方式獲得高精度時間,進而控制工作管理員的顯示。