CPU时间测试函数

来源:互联网 发布:伺服编码器数据乱跳 编辑:程序博客网 时间:2024/06/05 20:50

很多时候,我们想要统计一段代码运行的时间,但是这段代码运行的时间很短很短,以至于用clock()等函数获得时间的方法几乎是无效的。

那么我们该粗和获得高时间呢?

很多Intel的CPU有一条获得系统时钟的指令。我们可以用这条指令来获得时间。

rdtsc.h

[cpp] view plaincopy
  1. #if defined(__i386__)  
  2.   
  3. static __inline__ unsigned long long rdtsc(void)  
  4. {  
  5.   unsigned long long int x;  
  6.      __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));  
  7.      return x;  
  8. }  
  9. #elif defined(__x86_64__)  
  10.   
  11.   
  12. static __inline__ unsigned long long rdtsc(void)  
  13. {  
  14.   unsigned hi, lo;  
  15.   __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));  
  16.   return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );  
  17. }  
  18.   
  19. #elif defined(__powerpc__)  
  20.   
  21.   
  22. static __inline__ unsigned long long rdtsc(void)  
  23. {  
  24.   unsigned long long int result=0;  
  25.   unsigned long int upper, lower,tmp;  
  26.   __asm__ volatile(  
  27.                 "0:                  \n"  
  28.                 "\tmftbu   %0           \n"  
  29.                 "\tmftb    %1           \n"  
  30.                 "\tmftbu   %2           \n"  
  31.                 "\tcmpw    %2,%0        \n"  
  32.                 "\tbne     0b         \n"  
  33.                 : "=r"(upper),"=r"(lower),"=r"(tmp)  
  34.                 );  
  35.   result = upper;  
  36.   result = result<<32;  
  37.   result = result|lower;  
  38.   
  39.   return(result);  
  40. }  
  41.   
  42. #endif  
用法:

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. #include "rdtsc.h"  
  3.   
  4. int main(int argc, char* argv[])  
  5. {  
  6.   unsigned long long start_time end_time ;  
  7.   
  8.   start_time = rdtsc();  
  9.  //do something...  
  10.   
  11.   end_time = rdtsc();  
  12.   
  13.   printf("%llu\n", end_time-start_time);  
  14.   return 0;  
  15. }  
有了这个超高精度的时间函数,以后应用中对效率的比较会更准确。
《编程之美》中正是用这种方式获得高精度时间,进而控制任务管理器的显示。
0 0
原创粉丝点击