1. 程式人生 > >如何獲得高精度的CPU時間

如何獲得高精度的CPU時間

很多時候,我們想要統計一段程式碼執行的時間,但是這段程式碼執行的時間很短很短,以至於用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;
}
有了這個超高精度的時間函式,以後應用中對效率的比較會更準確。
《程式設計之美》中正是用這種方式獲得高精度時間,進而控制工作管理員的顯示。