使用rdtsc指令,测量程序的运行速度

转载 2016年08月16日 16:26:18

转自:http://blog.chinaunix.net/uid-24774106-id-2779245.html

 

最近发现了rdtsc指令,可以获取CPU指令周期数,喜出望外,wiki了下相关的知识,写了代码利用CPU周期来测量程序的运行时间。


    rdtsc指令返回的是自开机始CPU的周期数,返回的是一个64位的值EDX:EAX(高32在EDX,低32位在EAX)。OK,完全可以利用这条指令,测试我们的关注的一段代码的执行效率。

    题外话,我兴冲冲的告诉我老大,我发现了一个测量程序性能的好办法,老大淡然的说,不会是rdtsc吧。呵呵我和老大的水平差距还是云泥之别啊。他告诉我可以去Linux Kernel查看内核是如何做的。呵呵,我就照搬了kernel的实现。兼练习以下C和汇编混合编程。

    在网上搜索相关的资源看到了陈硕大牛的多核时代不宜再用 x86 的 RDTSC 指令测试指令周期和时间他给出了几个理由,有兴趣的兄弟可以去读下。
    1多核,不能保证每个核的TSC是一样的。
    2 CPU的时钟频率可变
    3 乱序执行导致测量不准。
   
    文献5指出,指令可能乱序执行,并给出个例子,下面的一段代码,本意是测量fdiv需要的CPU周期,但是,由于乱序执行,第二个rdtsc指令可能在fdiv之前执行,造成,无法测量fdiv的需要的CPU周期。文献给出了解决办法。有兴趣的兄弟可以去阅读参考文献5.


        rdtsc                   ; read time stamp
        mov     time, eax       ; move counter into variable
        fdiv                    ; floating-point divide
        rdtsc                   ; read time stamp
        sub     eax, time       ; find the differenc

参考文献:
1   深入理解计算机系统
2   Linux Kernel code
3   wiki

   

  1. #include
  2. #include
  3. #include<linux/types.h>

  4. #define TIMES  100
  5. #define SIZE 1024

  6. __u64 rdtsc()
  7. {
  8.         __u32 lo,hi;

  9.         __asm__ __volatile__
  10.         (
  11.          "rdtsc":"=a"(lo),"=d"(hi)
  12.         );
  13.         return (__u64)hi<<32|lo;
  14. }

  15. int myfunction()
  16. {
  17.         int i;
  18.         char *p = NULL;
  19.         for(i = 0;i<TIMES;i++)
  20.         {
  21.                 p = (char*)malloc(SIZE*sizeof(char));
  22.                 if(p)
  23.                 {
  24.                     free(p);
  25.                 }
  26.                 else
  27.                 {
  28.                     printf("malloc failed when i = %d\n",i);
  29.                 }
  30.         }
  31.         return 0;
  32. }
  33. int test_rdtsc()
  34. {
  35.         __u64 begin;
  36.         __u64 end;

  37.         begin = rdtsc();
  38.         myfunction();
  39.         end = rdtsc();
  40.         printf("myfunction cost %llu CPU cycles\n",end-begin);
  41.         return 0;
  42. }

  43. int main()
  44. {
  45.        test_rdtsc();
  46.         return 0;
  47. }
    执行结果如下
   
  1. root@libin:~/program/assembly/rdtsc# ./test
  2. myfunction cost 310949 CPU cycles

测量程序运行时间的几种方法

很久之前写的一篇文章了,现在趁着搬家,把它移过来,尽管不够全面,但是一般意义上的工作够用了。测量程序运行时间的几种方法 前一段时间在做一个优化程序性能的项目,为了测试优化的程度,粗略学习了一...

剑指offer17--旋转的方式打印矩阵

二维数组的旋转打印

用rdtsc实现linux下的精确计时

转自:http://blog.csdn.net/x86/article/details/2235267 在linux开发版最长问到的问题之一就是在linux下如何得到更精确的计时。其实有很多办法,比...

使用rdtsc测试程序的运行速度

              最近发现了rdtsc指令,可以获取CPU指令周期数,喜出望外,wiki了下相关的知识,写了代码利用CPU周期来测量程序的运行时间。       rdtsc指令...

Linux使用指令释放缓存提升系统运行速度的方法

Linux系统操作久了,就会产生很多看视频、下载文件留下的缓存,如果不定期清理则会导致系统变得很缓慢,下面小编就给大家介绍下Linux释放缓存的方法。   Linux系统的缓存机制是相当先进的,...

分别使用递归方法和非递归方法求斐波那契数列,并比较两者的运行速度(测量代码运行时间)

由运行时间可知,当数据量增大时,递归方法程序运行效率成为瓶颈,速度变得极为缓慢。 #include #include #include using namespace std; int Func...

(转)【Android游戏开发之十】(优化处理)详细剖析Android Traceview 效率检视工具!分析程序运行速度!并讲解两种创建SDcard方式!

李华明Himi 原创,转载务必在明显处注明: 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/316.html   ...
  • gxj1680
  • gxj1680
  • 2013年04月03日 18:02
  • 456
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用rdtsc指令,测量程序的运行速度
举报原因:
原因补充:

(最多只允许输入30个字)