用好binutils之gporf

來源:互聯網
上載者:User

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.