青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

A Za, A Za, Fighting...

堅信:勤能補拙

2011工具-gprof,性能分析

程序分析是以某種語言書寫的程序為對象,對其內部的運作流程進行分析。程序分析的目的主要有三點:一是通過程序內部各個模塊之間的調用關系,整體上把握程序的運行流程,從而更好地理解程序,從中汲取有價值的內容。二是以系統優化為目的,通過對程序中關鍵函數的跟蹤或者運行時信息的統計,找到系統性能的瓶頸,從而采取進一步行動對程序進行優化。最后一點,程序分析也有可能用于系統測試和程序調試中。當系統跟蹤起來比較復雜,而某個BUG又比較難找時,可以通過一些特殊的數據構造一個測試用例,然后將分析到的函數調用關系和運行時實際的函數調用關系進行對比,從而找出錯誤代碼的位置。

程序分析工具不同于調試器,它只產生程序運行時某些函數的調用次數、執行時間等等宏觀信息,而不是每條語句執行時的詳細信息。GprofLinux下一個強有力的程序分析工具。對于C、Pascal或者Fortran77語言的程序,它能夠以“日志”的形式記錄程序運行時的統計信息:程序運行中各個函數消耗的時間和函數調用關系,以及每個函數被調用的次數等等。從而可以幫助程序員找出眾多函數中耗時最多的函數,也可以幫助程序員分析程序的運行流程。相信這些功能對于分析開源代碼的程序員來說,有著相當大的誘惑力。

gprof分析程序

gprof對程序進行分析主要分以下三個步驟:

l         用編譯器對程序進行編譯,加上-pg參數。

l         運行編譯后的程序。

l         gprof命令查看程序的運行時信息。

先以一個簡單的例子演示一下吧。隨便找一個能夠運行的程序的源代碼,比如下面的文件test.c

 1 
 2 int IsEven(int x)
 3 
 4 {
 5 
 6        return 0 == x & 1;
 7 
 8 }
 9 
10 int main(int argc, char *argv[]
11 
12 {
13 
14        int i = 0;
15 
16        while(++< 1000) IsEven(i);
17 
18 }


首先,用以下命令進行編譯:

       [root@localhost]#gcc –o test –pg test.c

然后,運行可執行文件test.

       [root@localhost]#./test

運行后,在當前目錄下將生成一個文件gmon.out,這就是gprof生成的文件,保存有程序運行期間函數調用等信息。

最后,用gprof命令查看gmon.out保存的信息:

       [root@localhost]#gprof test gmon.out –b

這樣就有一大堆信息輸出到屏幕上,有函數執行單間,函數調用關系圖等等,如下:

Flat profile:

Each sample counts as 0.01 seconds.

 no time accumulated

  %   cumulative   self              self     total          

 time   seconds   seconds    calls  Ts/call  Ts/call  name   

  0.00      0.00     0.00     1000     0.00     0.00  IsEven(int)

 

                     Call graph

 

 

granularity: each sample hit covers 2 byte(s) no time propagated

 

index % time    self  children    called     name

                0.00    0.00    1000/1000        main [7]

[8]      0.0    0.00    0.00    1000         IsEven(int) [8]

-----------------------------------------------

 

Index by function name

 

   [8] IsEven(int)

以上介紹了gprof最簡單的使用方法,下面針對其使用過程中的三個步驟詳細說明。

編譯和鏈接

上面的例子中,程序比較簡單,只有一個文件。如果源代碼有多個文件,或者代碼結構比較復雜,編譯過程中先生成若干個目標文件,然后又由鏈接器將這些目標文件鏈接到一起,這時該怎么使用gprof呢?

對于由多個源文件組成的程序,編譯時需要在生成每個.o文件的時候加上-pg參數,同時在鏈接的時候也要加上-pg參數。對于鏈接器不是GCC的情況,如ld,又有特殊的要求。

同時,-pg參數只能記錄源代碼中各個函數的調用關系,而不能記錄庫函數的調用情況。要想記錄每個庫函數的調用情況,鏈接的時候必須指定庫函數的動態(或者靜態)鏈接庫libc_p.a,即加上-lc_p,而不是-lc。

還要說明的是,如果有一部分代碼在編譯時指定了-pg參數,而另一部分代碼沒有指定,則生成的gmon.out文件中將缺少一部分函數,也沒有那些函數的調用關系。但是并不影響gprof對其它函數進行記錄。

運行

編譯好的程序運行時和運行一般的程序沒有什么不同,只是比正常的程序多生成了一個文件gmon.out。注意,這個文件名是固定的,沒法通過參數的設置進行改變。如果程序目錄中已經有一個gmon.out,則它會被新的gmon.out覆蓋掉。

關于生成的gmon.out文件所在的目錄,也有以下約定:程序退出時所運行的文件所在目錄就是生成的gmon.out文件所在的目錄。如果一個程序執行過程中調用了另一個程序,并在另一個程序的運行中終止,則gmon.out會在另一個程序所在的目錄中生成。

還有一點要注意的就是當程序非正常終止時不會生成gmon.out文件,也因此就沒法查看程序運行時的信息。只有當程序從main函數中正常退出,或者通過系統調用exit()函數而退出時,才會生成gmon.out文件。而通過底層調用如_exit()等退出時不會生成gmon.out。

查看

查看程序運行信息的命令是gprof,它以gmon.out文件作為輸入,也就是將gmon.out文件翻譯成可讀的形式展現給用戶。其命令格式如下:

       gprof [可執行文件] [gmon.out文件] [其它參數]

方括號中的內容可以省略。如果省略了“可執行文件”,gprof會在當前目錄下搜索a.out文件作為可執行文件,而如果省略了gmon.out文件,gprof也會在當前目錄下尋找gmon.out。其它參數可以控制gprof輸出內容的格式等信息。最常用的參數如下:

l         -b 不再輸出統計圖表中每個字段的詳細描述。

l         -p 只輸出函數的調用圖(Call graph的那部分信息)。

l         -q 只輸出函數的時間消耗列表。

l         -e Name 不再輸出函數Name 及其子函數的調用圖(除非它們有未被限制的其它父函數)??梢越o定多個 -e 標志。一個 -e 標志只能指定一個函數。

l         -E Name 不再輸出函數Name 及其子函數的調用圖,此標志類似于 -e 標志,但它在總時間和百分比時間的計算中排除了由函數Name 及其子函數所用的時間。

l         -f Name 輸出函數Name 及其子函數的調用圖??梢灾付ǘ鄠€ -f 標志。一個 -f 標志只能指定一個函數。

l         -F Name 輸出函數Name 及其子函數的調用圖,它類似于 -f 標志,但它在總時間和百分比時間計算中僅使用所打印的例程的時間。可以指定多個 -F 標志。一個 -F 標志只能指定一個函數。-F 標志覆蓋 -E 標志。

l         -z 顯示使用次數為零的例程(按照調用計數和累積時間計算)。

程序分析是以某種語言書寫的程序為對象,對其內部的運作流程進行分析。程序分析的目的主要有三點:一是通過程序內部各個模塊之間的調用關系,整體上把握程序的運行流程,從而更好地理解程序,從中汲取有價值的內容。二是以系統優化為目的,通過對程序中關鍵函數的跟蹤或者運行時信息的統計,找到系統性能的瓶頸,從而采取進一步行動對程序進行優化。最后一點,程序分析也有可能用于系統測試和程序調試中。當系統跟蹤起來比較復雜,而某個BUG又比較難找時,可以通過一些特殊的數據構造一個測試用例,然后將分析到的函數調用關系和運行時實際的函數調用關系進行對比,從而找出錯誤代碼的位置。

程序分析工具不同于調試器,它只產生程序運行時某些函數的調用次數、執行時間等等宏觀信息,而不是每條語句執行時的詳細信息。GprofLinux下一個強有力的程序分析工具。對于C、Pascal或者Fortran77語言的程序,它能夠以“日志”的形式記錄程序運行時的統計信息:程序運行中各個函數消耗的時間和函數調用關系,以及每個函數被調用的次數等等。從而可以幫助程序員找出眾多函數中耗時最多的函數,也可以幫助程序員分析程序的運行流程。相信這些功能對于分析開源代碼的程序員來說,有著相當大的誘惑力。

gprof分析程序

gprof對程序進行分析主要分以下三個步驟:

l         用編譯器對程序進行編譯,加上-pg參數。

l         運行編譯后的程序。

l         gprof命令查看程序的運行時信息。

先以一個簡單的例子演示一下吧。隨便找一個能夠運行的程序的源代碼,比如下面的文件test.c

 1 
 2 int IsEven(int x)
 3 
 4 {
 5 
 6        return 0 == x & 1;
 7 
 8 }
 9 
10 int main(int argc, char *argv[]
11 
12 {
13 
14        int i = 0;
15 
16        while(++< 1000) IsEven(i);
17 
18 }


首先,用以下命令進行編譯:

       [root@localhost]#gcc –o test –pg test.c

然后,運行可執行文件test.

       [root@localhost]#./test

運行后,在當前目錄下將生成一個文件gmon.out,這就是gprof生成的文件,保存有程序運行期間函數調用等信息。

最后,用gprof命令查看gmon.out保存的信息:

       [root@localhost]#gprof test gmon.out –b

這樣就有一大堆信息輸出到屏幕上,有函數執行單間,函數調用關系圖等等,如下:

Flat profile:

Each sample counts as 0.01 seconds.

 no time accumulated

  %   cumulative   self              self     total          

 time   seconds   seconds    calls  Ts/call  Ts/call  name   

  0.00      0.00     0.00     1000     0.00     0.00  IsEven(int)

 

                     Call graph

 

 

granularity: each sample hit covers 2 byte(s) no time propagated

 

index % time    self  children    called     name

                0.00    0.00    1000/1000        main [7]

[8]      0.0    0.00    0.00    1000         IsEven(int) [8]

-----------------------------------------------

 

Index by function name

 

   [8] IsEven(int)

以上介紹了gprof最簡單的使用方法,下面針對其使用過程中的三個步驟詳細說明。

編譯和鏈接

上面的例子中,程序比較簡單,只有一個文件。如果源代碼有多個文件,或者代碼結構比較復雜,編譯過程中先生成若干個目標文件,然后又由鏈接器將這些目標文件鏈接到一起,這時該怎么使用gprof呢?

對于由多個源文件組成的程序,編譯時需要在生成每個.o文件的時候加上-pg參數,同時在鏈接的時候也要加上-pg參數。對于鏈接器不是GCC的情況,如ld,又有特殊的要求。

同時,-pg參數只能記錄源代碼中各個函數的調用關系,而不能記錄庫函數的調用情況。要想記錄每個庫函數的調用情況,鏈接的時候必須指定庫函數的動態(或者靜態)鏈接庫libc_p.a,即加上-lc_p,而不是-lc。

還要說明的是,如果有一部分代碼在編譯時指定了-pg參數,而另一部分代碼沒有指定,則生成的gmon.out文件中將缺少一部分函數,也沒有那些函數的調用關系。但是并不影響gprof對其它函數進行記錄。

運行

編譯好的程序運行時和運行一般的程序沒有什么不同,只是比正常的程序多生成了一個文件gmon.out。注意,這個文件名是固定的,沒法通過參數的設置進行改變。如果程序目錄中已經有一個gmon.out,則它會被新的gmon.out覆蓋掉。

關于生成的gmon.out文件所在的目錄,也有以下約定:程序退出時所運行的文件所在目錄就是生成的gmon.out文件所在的目錄。如果一個程序執行過程中調用了另一個程序,并在另一個程序的運行中終止,則gmon.out會在另一個程序所在的目錄中生成。

還有一點要注意的就是當程序非正常終止時不會生成gmon.out文件,也因此就沒法查看程序運行時的信息。只有當程序從main函數中正常退出,或者通過系統調用exit()函數而退出時,才會生成gmon.out文件。而通過底層調用如_exit()等退出時不會生成gmon.out。

查看

查看程序運行信息的命令是gprof,它以gmon.out文件作為輸入,也就是將gmon.out文件翻譯成可讀的形式展現給用戶。其命令格式如下:

       gprof [可執行文件] [gmon.out文件] [其它參數]

方括號中的內容可以省略。如果省略了“可執行文件”,gprof會在當前目錄下搜索a.out文件作為可執行文件,而如果省略了gmon.out文件,gprof也會在當前目錄下尋找gmon.out。其它參數可以控制gprof輸出內容的格式等信息。最常用的參數如下:

l         -b 不再輸出統計圖表中每個字段的詳細描述。

l         -p 只輸出函數的調用圖(Call graph的那部分信息)。

l         -q 只輸出函數的時間消耗列表。

l         -e Name 不再輸出函數Name 及其子函數的調用圖(除非它們有未被限制的其它父函數)??梢越o定多個 -e 標志。一個 -e 標志只能指定一個函數。

l         -E Name 不再輸出函數Name 及其子函數的調用圖,此標志類似于 -e 標志,但它在總時間和百分比時間的計算中排除了由函數Name 及其子函數所用的時間。

l         -f Name 輸出函數Name 及其子函數的調用圖??梢灾付ǘ鄠€ -f 標志。一個 -f 標志只能指定一個函數。

l         -F Name 輸出函數Name 及其子函數的調用圖,它類似于 -f 標志,但它在總時間和百分比時間計算中僅使用所打印的例程的時間。可以指定多個 -F 標志。一個 -F 標志只能指定一個函數。-F 標志覆蓋 -E 標志。

l         -z 顯示使用次數為零的例程(按照調用計數和累積時間計算)。



轉載: http://www.cnblogs.com/huangpeng/archive/2009/02/17/1392456.html

posted on 2011-08-12 10:33 simplyzhao 閱讀(457) 評論(0)  編輯 收藏 引用 所屬分類: R_找工復習2011

導航

<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

統計

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品成人一区| 亚洲精品美女在线观看播放| 国产精品初高中精品久久| 久久人体大胆视频| 久久色在线播放| 美腿丝袜亚洲色图| 免费人成精品欧美精品| 免费欧美在线视频| 欧美精品九九| 国产九九精品视频| 激情六月婷婷久久| 亚洲七七久久综合桃花剧情介绍| 亚洲黄色成人久久久| 亚洲日本免费| 亚洲欧美日韩另类精品一区二区三区| 亚洲欧美一区二区原创| 久久久999精品视频| 欧美国产先锋| 在线视频中文亚洲| 欧美一区二区精品| 欧美激情第4页| 国产一区二区久久| 亚洲人www| 久久国产精彩视频| 欧美激情1区2区3区| 亚洲一区免费在线观看| 久久精品视频在线观看| 欧美理论在线播放| 韩国精品在线观看| 中文欧美在线视频| 欧美va亚洲va香蕉在线| 亚洲欧美成人一区二区在线电影 | 国产欧美日韩中文字幕在线| 1024亚洲| 欧美一区二区三区四区高清| 欧美激情一区二区三区成人| 亚洲欧美国产高清| 欧美日韩成人一区二区三区| 激情一区二区三区| 亚洲欧美成人一区二区在线电影 | 久久精品人人爽| 欧美亚日韩国产aⅴ精品中极品| 国产伊人精品| 欧美在线高清视频| 一区二区三区福利| 欧美日韩国产色视频| 亚洲大胆在线| 久久久久一本一区二区青青蜜月| 一二三区精品福利视频| 欧美理论电影在线播放| 日韩视频免费| 免费毛片一区二区三区久久久| 亚洲激情影视| 久久综合狠狠综合久久综青草 | 麻豆精品网站| 激情欧美一区二区| 久久久久久97三级| 亚洲欧美一区二区精品久久久| 欧美美女bb生活片| 日韩午夜黄色| 亚洲精品久久久久久久久久久久久| 久久久青草青青国产亚洲免观| 国产亚洲va综合人人澡精品| 久久国产88| 欧美亚洲在线| 影音先锋久久| 另类天堂av| 久久久精品免费视频| 国产在线观看91精品一区| 久久亚洲影音av资源网| 久久久久久久97| 亚洲欧洲日产国产综合网| 欧美激情国产精品| 欧美日精品一区视频| 亚洲欧美日韩国产综合在线 | 欧美日韩一区二区三区在线视频| 一本色道久久综合亚洲91| 日韩一区二区精品葵司在线| 国产精品vvv| 久久久欧美一区二区| 久久人人爽爽爽人久久久| 亚洲精品小视频在线观看| av成人黄色| 国模精品一区二区三区色天香| 蜜桃av一区| 欧美日产一区二区三区在线观看| 亚洲综合不卡| 欧美一区二区在线免费观看| 亚洲第一天堂无码专区| 亚洲精品一二三| 国产亚洲网站| 亚洲肉体裸体xxxx137| 国产精品久久网| 欧美99在线视频观看| 欧美日韩一区自拍| 久久久欧美精品sm网站| 欧美日韩国产限制| 久久久另类综合| 国产精品成人免费视频| 欧美国产一区二区| 国产精品主播| 亚洲国产高清一区二区三区| 国产精品国产三级国产| 欧美成人免费播放| 国产精品久久久久久久久久久久| 久久在线免费观看视频| 小黄鸭精品aⅴ导航网站入口| 亚洲黄网站在线观看| 国产精品v欧美精品v日韩精品| 欧美一区91| 欧美激情一区二区三区| 久久xxxx精品视频| 欧美日韩成人综合天天影院| 麻豆精品视频在线| 国产精品美女久久久久aⅴ国产馆| 久久一区二区三区四区五区| 国产精品久久久久国产a级| 亚洲高清视频一区二区| 国产主播精品| 黑人巨大精品欧美一区二区小视频| 欧美插天视频在线播放| 国产精品午夜视频| 一本色道久久88亚洲综合88| 亚洲人成绝费网站色www| 久久蜜臀精品av| 欧美中文字幕久久| 国产精品久久久久久影视| 亚洲欧洲日韩女同| 亚洲伦理在线免费看| 美女久久网站| 卡一卡二国产精品| 国产一区二区久久精品| 午夜精品久久久久久久99黑人| 中文欧美字幕免费| 欧美日韩在线高清| 日韩五码在线| 亚洲一二三区精品| 欧美视频精品一区| 亚洲激情网址| 亚洲精品小视频在线观看| 久久婷婷影院| 欧美国产乱视频| 亚洲精品久久久久| 欧美精品激情在线观看| 亚洲人成啪啪网站| 亚洲无线一线二线三线区别av| 欧美午夜剧场| 亚洲在线免费| 久久人人97超碰精品888| 国产一区二区三区的电影 | 在线视频欧美一区| 香蕉国产精品偷在线观看不卡| 国产精品综合| 欧美制服丝袜| 欧美激情第9页| 一区二区三区视频在线观看| 欧美日韩一区高清| 亚洲自拍都市欧美小说| 欧美一区二区三区日韩视频| 国产亚洲欧美日韩在线一区| 久久人人超碰| 日韩一区二区精品| 欧美在线关看| 亚洲美女电影在线| 国产欧美精品日韩精品| 狼狼综合久久久久综合网| 日韩视频一区二区在线观看| 久久激情五月丁香伊人| 日韩性生活视频| 午夜欧美电影在线观看| 国产综合亚洲精品一区二| 免费观看亚洲视频大全| 夜夜嗨av一区二区三区四季av| 欧美亚洲尤物久久| 在线观看日韩| 国产精品久久久久久户外露出| 午夜精品视频| 亚洲精品一区二区三区樱花| 欧美亚洲自偷自偷| 亚洲国产一区二区视频 | 激情五月综合色婷婷一区二区| 欧美高清不卡| 亚洲一二三区精品| 亚洲国产日日夜夜| 国产欧美一区二区色老头 | 久久久综合香蕉尹人综合网| 日韩亚洲视频| 欧美高清在线一区| 久久久蜜桃精品| 亚洲综合色网站| 日韩一级在线观看| 亚洲国产精彩中文乱码av在线播放| 国产精品乱码一区二三区小蝌蚪 | 国产伦精品一区二区三区高清| 女人天堂亚洲aⅴ在线观看| 亚洲欧美综合精品久久成人| 99国产精品视频免费观看| 欧美高清视频在线观看| 老色鬼精品视频在线观看播放| 亚洲欧美久久|