zoukankan      html  css  js  c++  java
  • 用好binutils之gporf


    gporf被称为GNU简档器,是binutils中的一个程序。这个程序可以帮我们找出程序运行时需要处理时间最长的函数。通过它我们可以有效的改善我们程序的效率。

    为了有效的使用我们的gprof工具,必须确保参数-pg编译希望监视的函数 ,用这个参数编译源代码,会为程序的每个函数插入对mcount自子例程的调用,当运用程序运行时,mcount子例程创建一个调用图表简档文件,即gmon.out,它包含了程序中每个函数的计时信息。
    程序测试完之后,就可以使用gprof程序来查看调用图表简档文件,gprof的能够输出以下几项内容:
        一般简档报告(flat profile),显示每个函数在你的程序中花费的时间和被调用的次数。
        调用图表(call graph),显示对每个函数的,调用者和被调用者以及次数。每个函数的子路径执行时间的估计。
        源代码注释列表(annotate source listing),是源程序的一份copy,里面标明了每行执行时间。

    下面我们举个例子,这个程序的名字是test.c
    #include <stdio.h>

    void fun1()
    {
        int i,j;
        for (i=0;i<10000;i++)
            j=i;
    }

    void fun2()
    {
        int i,j;
        fun1();
        for (i=0;i<40000;i++)
            j=i;
    }

    int main()
    {
        int i;
       
        for(i=0;i<100;i++)
            fun1();
       
        for(i=0;i<1000;i++)
            fun2();
       
        return(0);
    }
    主程序有两个循环,一个调用fun1()100次,一个调用fun2()1000次,而在每个函数fun2()又都调用函数fun1(),所以fun1()总共调用了1100次,但还是fun2()占了更多的时间。
    下一步使用-pg参数编译程序,以便能够使用gprof。编译之后运行程序。
    $gcc -o test test.c -pg
    $./test
    程序运行结束后会产生gmon.out调用图表文件,查看一下生成的文件
    $ls -al gmon.out
    -rw-rw-r-- 1 secularbird secularbird 464 2007-10-16 22:38 gmon.out
    接下来运行gprof,由于产生的输出是到标准输出的,所以我们进行一次重定向
    $gprof test > gprof.txt
    注:gprof的默认参数是 -p -g对于不同的系统可能有些不同。

    下面是我gprof.txt文件中的一部分,各人的结果可能有点不同
    Flat profile:

    Each sample counts as 0.01 seconds.
      %   cumulative   self              self     total           
     time   seconds   seconds    calls  us/call  us/call  name   
     85.31      0.28     0.28     1000   281.51   327.21  fun2
     15.23      0.33     0.05     1100    45.70    45.70  fun1
    由此可见和我们之前分析的一样,fun1调用了1100次,fun2被调用了1000次,fun2占用了85.31%即大部分的时间。
                 Call graph (explanation follows)


    granularity: each sample hit covers 2 byte(s) for 3.01% of 0.33 seconds

    index % time    self  children    called     namea
                                                     <spontaneous>
    [1]    100.0    0.00    0.33                 main [1]
                    0.28    0.05    1000/1000        fun2 [2]
                    0.00    0.00     100/1100        fun1 [3]
    -----------------------------------------------
                    0.28    0.05    1000/1000        main [1]
    [2]     98.6    0.28    0.05    1000         fun2 [2]
                    0.05    0.00    1000/1100        fun1 [3]
    -----------------------------------------------
                    0.00    0.00     100/1100        main [1]
                    0.05    0.00    1000/1100        fun2 [2]
    [3]     15.2    0.05    0.00    1100         fun1 [3]
    在call gprah中可以看出index[1]在main函数中fun1总共被调用了100次,fun2总共被调用了1000次,
    index[2]在整个的程序中,fun2总共被调用了1000次,而fun2总共调用了fun1 1000次。
    index[3]在整个的程序中,main调用100次的fun1,fun2调用了1000次的fun1,fun1总共被调用了1100次
    以上内容仅供参考,实际情况可以设置gprof参数得到个人所需的内容。

    参考资料
        《Professional Assemble language》Richard Blum著
        man gprof


     
  • 相关阅读:
    给C# 2005提供VB2005特有的My命名空间!
    利用iTextSharp把DataTable导出为PDF和RTF(Rich Text Format)文件
    [非技术][小孩]色色的小孩
    中秋节快乐!
    SnipperImages(Silverlight DEMO)控件设计之Slider和ColorSlider
    IE8的Activities,WebSlices示例ie8.taobao.com
    Net框架中的设计模式之Builder(构造者)兼谈抽象工厂和composite模式
    DiscuzNT 商品交易插件设计之[线下交易流程]
    听“汉代风云”,看“晁错之死”
    [翻译] python Tutorial 之一
  • 原文地址:https://www.cnblogs.com/zelos/p/3402914.html
Copyright © 2011-2022 走看看