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

C++ Coder

HCP高性能計算架構,實現,編譯器指令優化,算法優化, LLVM CLANG OpenCL CUDA OpenACC C++AMP OpenMP MPI

C++博客 首頁 新隨筆 聯系 聚合 管理
  98 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks
http://blog.csdn.net/bendanban/article/details/7742593

在網上找了找關于Progfile的工具,找到了這篇文章覺得不錯,轉來分享下。對原文修改了下。

本文介紹了如何使用Gnu gprof 對Linux平臺下的現有程序進行優化分析和生成程序調用圖。主要偏重于對生成和使用流程圖作介紹.

Gprof 簡介:
Gprof功能:打印出程序運行中各個函數消耗的時間,可以幫助程序員找出眾多函數中耗時最多的函數。產生程序運行時候的函數調用關系,包括調用次數,可以幫助程序員分析程序的運行流程。
有了函數的調用關系,這會讓開發人員大大提高工作效率,不用費心地去一點點找出程序的運行流程,這對小程序來說可能效果不是很明顯,但對于有幾萬,幾十萬代碼量的工程來說,效率是毋庸置疑的!而且這個功能對于維護舊代碼或者是分析Open Source來說那是相當誘人的,有了調用圖,對程序的運行框架也就有了一個大體了解,知道了程序的“骨架“,分析它也就不會再那么茫然,尤其是對自己不熟悉的代碼和Open Source。費話不多說了,讓我們開始我們的分析之旅吧!

Gprof 實現原理:
通過在編譯和鏈接你的程序的時候(使用 -pg 編譯和鏈接選項),gcc 在你應用程序的每個函數中都加入了一個名為mcount ( or  “_mcount”  , or  “__mcount” , 依賴于編譯器或操作系統)的函數,也就是說你的應用程序里的每一個函數都會調用mcount, 而mcount 會在內存中保存一張函數調用圖,并通過函數調用堆棧的形式查找子函數和父函數的地址。這張調用圖也保存了所有與函數相關的調用時間,調用次數等等的所有信息。

Gprof基本用法:
1. 使用 -pg 編譯和鏈接你的應用程序。

2. 執行你的應用程序使之生成供gprof 分析的數據。

3. 使用gprof 程序分析你的應用程序生成的數據。

Gprof 簡單使用:
讓我們簡單的舉個例子來看看Gprof是如何使用的。

1.打開linux終端。新建一個test.c文件,并生用-pg 編譯和鏈接該文件。 test.c 文件內容如下:
#include "stdio.h"
#include 
"stdlib.h"
void a()
{
  printf(
"\t\t+---call a() function\n");
}

void c()
{
  printf(
"\t\t+---call c() function\n");
}

int b()
{
  printf(
"\t+--- call b() function\n");
  a();
  c();
  
return 0;
}


int main()
{
  printf(
" main() function()\n");
  b();
}

命令行里面輸入下面命令,沒加-c選項,gcc 會默認進行編譯并鏈接生成a.out:
$gcc -pg test.c

如果沒有編譯錯誤,gcc會在當前目錄下生成一個a.out文件,當然你也可以使用 –o 選項給生成的文件起一個別的名字,像 gcc –pg test.c –o test , 則gcc會生成一個名為test的可執行文件,在命令行下輸入[linux /home/test]$./test , 就可以執行該程序了,記住一定要加上 ./ 否則程序看上去可能是執行,可是什么輸出都沒有。

 

2.執行你的應用程序使之生成供gprof 分析的數據。  命令行里面輸入:

[linux /home/test]$a.out
main() function()
+--- call b() function
+---call a() function
+---call c() function

你會在當前目錄下看到一個gmon.out 文件, 這個文件就是供gprof 分析使用的。

 

3.使用gprof 程序分析你的應用程序生成的數據。
命令行里面輸入:

 

$ gprof -b a.out gmon.out | less

由于gprof輸出的信息比較多,這里使用了 less 命令,該命令可以讓我們通過上下方向鍵查看gprof產生的輸出,| 表示gprof -b a.out gmon.out 的輸出作為 less的輸入。下面是我從gprof輸出中摘抄出的與我們有關的一些詳細信息。

%     cumulative    self              self     total
time   seconds     seconds    calls  Ts
/call  Ts/call  name
0.00      0.00     0.00        1     0.00     0.00  a
0.00      0.00     0.00        1     0.00     0.00  b
0.00      0.00     0.00        1     0.00     0.00  c

Call graph

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

index 
% time    self  children    called     name
0.00    0.00       1/1           b [2]
[
1]      0.0    0.00    0.00       1         a [1]
-----------------------------------------------
0.00    0.00       1/1           main [10]
[
2]      0.0    0.00    0.00       1         b [2]
0.00    0.00       1/1           a [1]
0.00    0.00       1/1           c [3]
-----------------------------------------------
0.00    0.00       1/1           b [2]
[
3]      0.0    0.00    0.00       1         c [3]

從上面的輸出我們能明顯的看出來,main 調用了 b 函數, 而b 函數分別調用了a 和 c 函數。由于我們的函數只是簡單的輸出了一個字串,故每個函數的消耗時間都是0 秒。

 


常用的Gprof 命令選項解釋:

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

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

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

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

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

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

-f Name輸出函數Name 及其子函數的調用圖。可以指定多個 -f 標志。一個 -f 標志只能指定一個函數。

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

到這為止你可能對gprof 有了一個比較感性的認識了,你可能會問如何用它去分析一個真正的Open Source 呢!下面就讓我們去用gprof去分析一個Open Source,看看如何去在真實的環境中使用它。

使用Gprof 分析 Cflow開源項目
CFlow 是程序流程分析工具,該工具可以通過分析C源代碼,產生程序調用圖!有點跟Gprof差不多,不過CFlow是通過源代碼進行的靜態分析并且 不能分析C++ 程序,你可以到http://www.gnu.org/software/cflow/去下載源代碼。

假設你已經下載了該源代碼(cflow-1.1.tar.gz),并把它放置在/home目錄下,讓我們看看如何在這個應用上使用gprof。

1. 使用 -pg 編譯和鏈接該應用程序,請輸入下列命令。

 

[linux /home/]tar zxvf cflow-1.1.tar.gz
[linux /home/cflow-1.1/src]$./configure
[linux /home]$make CFLAGS=-pg LDFLAGS=-pg 

如果沒有出錯你會在/home/cflow-1.1/src 目錄下發行一個名為cflow的可執行文件,這就是我們加入-pg編譯選項后編譯出來的可以產生供gprof提取信息的可執行文件。記住一定要在編譯和鏈接的時候都使用-pg選項,否則可能不會產生gmon.out文件。對于cflow項目,CFLAGS=-pg 是設置它的編譯選項,LDFLAGS=-pg是設置它的鏈接選項。當然你也可以直接修改它的Makefile來達到上述相同的目的,不過一定要記住編譯和鏈接都要使用-pg選項。

 

2. 運行cflow 程序使之生成gmon.out 文件供gprof使用。

 

[linux /home/cflow-1.1/src]$cflow parser.c

查看/home/cflow-1.1/src目錄下有沒有產生gmon.out文件,如果沒有請重復第一步,并確認你已經在編譯和鏈接程序的時候使用了-pg 選項。Cflow的使用請參考http://www.gnu.org/software/cflow/manual/cflow.html

 

3. 使用gprof分析程序
[linux /home/cflow-1.1/src]$gprof -b cflow gmon.out | less
恭喜你,不出意外你會在屏幕上看到gprof的輸出,函數消耗時間和函數調用圖,下面是我從我的輸出中摘抄出來的一小段。

 

%   cumulative   self              self     total time   seconds   seconds    calls  Ts/call  Ts/call  name 0.00      0.00     0.00   118262     0.00     0.00  include_symbol 0.00      0.00     0.00    92896     0.00     0.00  is_printable 0.00      0.00     0.00    28704     0.00     0.00  set_level_mark 0.00      0.00     0.00    28703     0.00     0.00  is_last 0.00      0.00     0.00    19615     0.00     0.00  auto_processor 0.00      0.00     0.00    15494     0.00     0.00  gnu_output_handler 0.00      0.00     0.00    12286     0.00     0.00  delete_parm_processor 0.00      0.00     0.00     7728     0.00     0.00  newline 0.00      0.00     0.00     7728     0.00     0.00  print_function_name 0.00      0.00     0.00     7728     0.00     0.00  print_level

。。。。。。 。。。。。。

Call graph

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

index % time    self  children   called     name [1]      0.0    0.00    0.00     79+855  [1] 0.00    0.00    166     dcl [52] 0.00    0.00    163     parse_dcl [53] 0.00    0.00    150     dirdcl [56] 0.00    0.00    129     parse_declaration [63] 0.00    0.00     98     parse_variable_declaration [66] 0.00    0.00     63     maybe_parm_list [69] 0.00    0.00     63    parse_function_declaration [70] 0.00    0.00     39    func_body [74]

。。。。。。 。。。。。。

 


通過分析%time你就知道了那個函數消耗的時間最多,你可以根據這個輸出信息做有目的的優化,不過cflow執行的速度是在是太快了,以至%time都是0 (消耗時間是以秒為單位進行統計的)。

 

生成圖形化的函數調用圖

1.Graphviz 工具
看到這里你也可能覺得上面的函數調用圖實在是不方便察看,也看不出來一個程序調用的整體框架。沒有關系,我再介紹一個有用的工具給你,使用 Graphviz,Graphviz or Graph Visualization 是由 AT&T 開發的一個開源的圖形可視化工具。它提供了多種畫圖能力,但是我們重點關注的是它使用 Dot 語言直連圖的能力。在這里,將簡單介紹如何使用 Dot 來創建一個圖形,并展示如何將分析數據轉換成 Graphviz 可以使用的規范, Dot 使用的圖形規范。

使用 Dot 語言,你可以指定三種對象:圖、節點和邊。為了讓你理解這些對象的含義,我將構建一個例子來展示這些元素的用法。


下圖給出了一個簡單的定向圖(directed graph),其中包含 3 個節點。第一行聲明這個圖為 G,并且聲明了該圖的類型(digraph)。接下來的三行代碼用于創建該圖的節點,這些節點分別名為 node1、node2 和 node3。節點是在它們的名字出現在圖規范中時創建的。邊是在在兩個節點使用邊操作(->)連接在一起時創建的,如第 6 行到第 8 行所示。我還對邊使用了一個可選的屬性 label,用它來表示邊在圖中的名稱。最后,在第 9 行完成對該圖規范的定義。
使用 Dot 符號表示的示例圖(test.dot)

 

digraph G {
    node1;
    node2;
    node3;

    node1 
-> node2 [label="edge_1_2"];
    node1 
-> node3 [label="edge_1_3"];
    node2 
-> node3 [label="edge_2_3"];
 }

要將這個 .dot 文件轉換成一個圖形映像,則需要使用 Dot 工具,這個工具是在 Graphviz 包中提供的。清單 6 介紹了這種轉換。
清單 6. 使用 Dot 來創建 JPG 映像
[linux /home]$ dot -Tjpg test.dot -o test.jpg
在這段代碼中,我告訴 Dot 使用 test.dot 圖形規范,并生成一個 JPG 圖像,將其保存在文件 test.jpg 中。所生成的圖像如圖1所示。在此處,我使用了 JPG 格式,但是 Dot 工具也可以支持其他格式,其中包括 GIF、PNG 和 postscript等等。

 


Dot創建的實例圖

Dot 語言還可以支持其他一些選項,包括外形、顏色和很多屬性。有興趣可以查看graphviz相關文檔。
2.從gprof的輸出中提取調用圖信息,產生可供Graphviz使用的dot文件。
這樣的腳本有人已經實現了,我們只要下載一個現成的就可以了,首先從http://www.ioplex.com/~miallen/ 網站下載一個mkgraph腳本。解壓該腳本到包含gmon.out文件的目錄下。使用mkgraph0.sh產生調用的jpg圖像文件。例如:使用上面的例子,生成cflow的調用圖。
[linux /home/cflow-1.1/src]$ mkgraph0.sh cflow gmon.out
部分調用圖如下,有了這個圖是不是對程序整體框架有了個清晰地了解,如果你對生成的調用圖效果不滿意,你還可以通過修改mkgraph0腳本使之產生合適的dot文件即可:

總結:
使用gprof , Graphviz , mkgraph 生成函數調用圖
1. 使用 -pg 編譯和鏈接你的應用程序。
2. 執行你的應用程序使之生成供gprof 分析的數據。
3. 使用mkgraph腳本生成圖形化的函數調用圖。

相關資料:
文檔:用 Graphviz 可視化函數調用
文檔:Speed your code with the GNU profiler
文檔:gropf 幫助文件
Mkgraph 腳本:http://www.ioplex.com/~miallen/
Graphviz 工具:http://www.graphviz.org
Cflow         :http://www.gnu.org/software/cflow/
(責任編輯:城塵 68476636-8003)

原文地址:點擊打開鏈接http://os.51cto.com/art/200703/41426_2.htm








posted on 2012-10-21 12:36 jackdong 閱讀(528) 評論(0)  編輯 收藏 引用 所屬分類: 性能分析工具

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久乐国产精品| 午夜精品久久久久久久蜜桃app| 亚洲激情在线观看视频免费| 一二三区精品| 亚洲黄色在线观看| 久久免费偷拍视频| 国产精品实拍| 欧美黄色小视频| 欧美色偷偷大香| 亚洲国产第一页| 欧美激情第10页| 久久久久久久999| 国内精品视频在线播放| 午夜精品久久久久久久99热浪潮 | 欧美精品色一区二区三区| 亚洲欧美激情视频在线观看一区二区三区 | 91久久久精品| 久久久久久久综合狠狠综合| 国产人妖伪娘一区91| 亚洲精品之草原avav久久| 蜜臀av性久久久久蜜臀aⅴ| 亚洲欧美另类在线观看| 久久精品72免费观看| 欧美亚洲网站| 欧美三级午夜理伦三级中文幕| 国产精品色网| 一区二区国产日产| 国产精品一区二区三区成人| 亚洲国产小视频| 影音欧美亚洲| 国产在线拍偷自揄拍精品| 亚洲一区999| 牛牛精品成人免费视频| 久久综合国产精品| 欧美日韩黄视频| 欧美韩日亚洲| 久久嫩草精品久久久精品| 1000部国产精品成人观看| 国产精品yjizz| 国产日韩精品一区二区浪潮av| 国产一区二区三区久久精品| 国产精品高潮呻吟| 亚洲一区二区欧美日韩| 狂野欧美激情性xxxx欧美| 91久久久亚洲精品| 亚洲缚视频在线观看| 欧美精品一区二区在线观看| 香蕉久久夜色精品国产| 久久久久久69| 国产精品免费观看在线| 中文精品99久久国产香蕉| 久热成人在线视频| 国产一区二区三区久久 | 亚洲三级免费| 午夜在线观看免费一区| 久久精品二区三区| 欧美中文字幕视频在线观看| 免费在线欧美黄色| 亚洲国产精品久久久久秋霞影院| 亚洲夜晚福利在线观看| 国产精品网站在线| 国产精品视频免费在线观看| 久久精品国产欧美激情| 欧美岛国激情| 久久精彩视频| 噜噜噜久久亚洲精品国产品小说| 亚洲乱码精品一二三四区日韩在线 | 久久视频这里只有精品| 伊人久久婷婷色综合98网| 国产日韩精品久久久| 韩国美女久久| 精品动漫一区| 一区二区三区av| 亚洲日本成人女熟在线观看| 亚洲国产精品精华液2区45| 亚洲免费成人| 午夜免费电影一区在线观看| 欧美成人小视频| 欧美女同视频| 欧美日韩精品久久久| 欧美精品久久久久a| 久久青草久久| 久久久成人精品| 久久久www成人免费毛片麻豆| 亚洲欧美在线一区| 亚洲香蕉成视频在线观看 | 欧美激情va永久在线播放| 欧美日韩高清在线一区| 欧美日韩黄色一区二区| 国内精品嫩模av私拍在线观看| 欧美日韩一卡| 欧美freesex交免费视频| 欧美大胆成人| 欧美成人网在线| 亚洲第一精品夜夜躁人人爽| 午夜伦理片一区| 欧美一站二站| 久久精品av麻豆的观看方式| 欧美精品一区二区在线观看| 在线观看欧美亚洲| 亚洲美女av黄| 好吊日精品视频| 亚洲欧美另类中文字幕| 一二三区精品| 国产精品成人观看视频国产奇米| 亚洲一区区二区| 韩日成人av| 欧美成人精品1314www| 欧美一区亚洲| 久久免费视频这里只有精品| 合欧美一区二区三区| 亚洲欧洲精品一区二区三区波多野1战4| 欧美ed2k| 亚洲国产高清自拍| 欧美成人精品在线视频| 亚洲黄色av一区| 久久久综合网| 亚洲国产另类久久精品| 欧美一级成年大片在线观看| 伊人久久综合97精品| 男女精品视频| 欧美一区二区三区成人| 一本久道久久综合狠狠爱| 免费欧美日韩| 久久久久91| 亚洲五月婷婷| 日韩视频二区| 欧美精品在线观看91| 久久国产日本精品| 久久伊人一区二区| 欧美激情一区二区三区高清视频| 免费成人av在线看| 国产精品久久久91| 欧美在线观看你懂的| 国产精品高潮呻吟久久av黑人| 久久狠狠一本精品综合网| 欧美日韩国产成人| 欧美jizz19性欧美| 91久久国产综合久久蜜月精品| 午夜精品福利电影| 日韩视频在线观看国产| 午夜精品福利在线观看| 欧美日韩高清在线| 日韩视频免费大全中文字幕| 韩国av一区二区三区在线观看| 亚洲精品少妇| 欧美在线观看视频在线| 国产欧美午夜| 99re在线精品| 久久久另类综合| 影音先锋久久久| 女人天堂亚洲aⅴ在线观看| 欧美xxxx在线观看| 9i看片成人免费高清| 国产精品一区二区男女羞羞无遮挡| 亚洲一区影音先锋| 欧美丰满高潮xxxx喷水动漫| 久久综合999| 日韩一级成人av| 一区在线观看视频| 先锋亚洲精品| 久久久久久久一区二区三区| 国产日本欧美视频| 久久成人精品视频| 米奇777在线欧美播放| 亚洲精品日韩综合观看成人91 | 欧美在线观看日本一区| 亚洲欧美日韩国产中文在线| 国产精品视频免费| 欧美一区二区精品在线| 久久久亚洲欧洲日产国码αv| 亚洲成人原创| 欧美日本免费一区二区三区| 亚洲欧美日韩在线综合| 国产精品日韩一区二区三区| 久久国产精品久久w女人spa| 亚洲国产精品va在线看黑人动漫| 亚洲国产一区在线观看| 欧美日韩伦理在线| 午夜一区不卡| 亚洲高清视频一区二区| 亚洲欧美电影在线观看| 今天的高清视频免费播放成人| 欧美久久一区| 性xx色xx综合久久久xx| 香蕉久久夜色精品国产| 亚洲人成网在线播放| 在线亚洲国产精品网站| 国产亚洲欧美一区| 欧美成人黄色小视频| 亚洲欧美成人精品| 亚洲电影免费观看高清完整版在线观看 | 夜夜嗨av一区二区三区网页| 国产精品欧美久久| 久久久亚洲一区| 亚洲一级特黄| 亚洲欧洲精品一区二区三区 | 欧美三级精品| 久久久久网址| 亚洲欧美999|