亚洲一级电影在线观看,九九精品无码专区免费,亚洲AV无码资源在线观看 ,欧美国产高清

Linux下程序的Profile工具

時間:2024-09-23 06:38:20 Linux認證 我要投稿
  • 相關推薦

Linux下程序的Profile工具

  我們在寫嵌入式程序時,通常需要對程序的性能進行分析,以便程序能夠更快更好地運行,達到實時(real-time)的目的。如果程序很大,分析起來就很困難。如果有個工具能夠自動進行程序的性能分析,那就最好了。這里介紹一種Linux下程序的Profiling工具----GNU profiler。

  gprof的基本用法:

  1. 使用 -pg 選項編譯和鏈接你的應用程序

  在gcc編譯程序的時候,加上-pg選項,例如:

  gcc -pg -o test test.c

  這樣就生成了可執行文件test。如果是大項目,就在makefile里面修改編譯選項,-pg放在那里都行。

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

  運行剛才的程序:./test,這樣就生成了一個gmon.out文件,該文件就包含了profiling的數據。

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

  gprof test gmon.out > profile.txt

  使用上面的命令,gprof就可以分析程序test的性能,將profiling的結果放在profile.txt文件中,打開就可以看到分析的結果。通過對結果的分析來改進我們的程序,從而達到我們的目的。

  GNU gprof是個很不錯的工具,大家寫程序時可以多用用。我現在用gprof來profiling我的程序,把耗時最多的函數或運算找出來,用FPGA芯片實現,從而達到real-time的目的。

  為gprof編譯程序

  在編譯或鏈接源程序的時候在編譯器的命令行參數中加入“-pg”選項,編譯時編譯器會自動在目標代碼中插入用于性能測試的代碼片斷,這些代碼在程序在運行時采集并記錄函數的調用關系和調用次數,以及采集并記錄函數自身執行時間和子函數的調用時間,程序運行結束后,會在程序退出的路徑下生成一個gmon.out文件。這個文件就是記錄并保存下來的監控數據?梢酝ㄟ^命令行方式的gprof或圖形化的Kprof來解讀這些數據并對程序的性能進行分析。另外,如果想查看庫函數的profiling,需要在編譯是再加入“-lc_p”編譯參數代替“-lc”編譯參數,這樣程序會鏈接libc_p.a庫,才可以產生庫函數的profiling信息。如果想執行一行一行的profiling,還需要加入“-g”編譯參數。

  例如如下命令行:

  gcc -Wall -g -pg -lc_p example.c -o example

  執行gprof

  執行如下命令行,即可執行gprof:

  gprof OPTIONS EXECUTABLE-FILE gmon.out BB-DATA [YET-MORE-PROFILE-DATA -FILES...] [> OUTFILE]

  gprof產生的信息

  % the percentage of the total running time of the

  time program used by this function.

  函數使用時間占所有時間的百分比。

  cumulative a running sum of the number of seconds accounted

  seconds for by this function and those listed above it.

  函數和上列函數累計執行的時間。

  self the number of seconds accounted for by this

  seconds function alone. This is the major sort for this

  listing.

  函數本身所執行的時間。

  calls the number of times this function was invoked, if

  this function is profiled, else blank.

  函數被調用的次數

  self the average number of milliseconds spent in this

  ms/call function per call, if this function is profiled,

  else blank.

  每一次調用花費在函數的時間microseconds。

  total the average number of milliseconds spent in this

  ms/call function and its descendents per call, if this

  function is profiled, else blank.

  每一次調用,花費在函數及其衍生函數的平均時間microseconds。

  name the name of the function. This is the minor sort

  for this listing. The index shows the location of

  the function in the gprof listing. If the index is

  in parenthesis it shows where it would appear in

  the gprof listing if it were to be printed.

  函數名

  prof 實現原理:

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

  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:

  引文:

  [linux /home/test]$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

  [linux /home/test]$

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

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

  命令行里面輸入:

  引文:

  [linux /home/test]$ gprof -b a.out gmon.out | less

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

  引文:

  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 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 c [3]

  0.00 0.00 1/1 a [1]

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

  0.00 0.00 1/1 b [2]

  [3] 0.0 0.00 0.00 1 c [3]

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

  Index by function name

  [1] a [2] b [3] c

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

【Linux下程序的Profile工具】相關文章:

常用的Linux網絡工具08-02

Linux系統shell工具打印輸出12-26

最簡單的Linux驅動程序09-09

Linux系統下ftp的管理08-19

Linux認證系統管理:linux下搭建ftp10-08

Linux Shell文本處理工具10-08

java程序中如何調用linux命令08-27

linux下etc/fstab文件的簡介10-23

Linux系統下如何刪除文件夾01-11

主站蜘蛛池模板: 久久精品无码专区免费青青| 成人精品视频一区二区在线| 国产明星视频愉拍在线| 亚洲国产精品一区二区第一页免 | 精品国产自在久久现线拍| 精品人妻系列无码一区二区三区 | 免费人成自慰网站| 精品丝袜人妻久久久久久| 亚洲欧美一区二区三区麻豆| 欧美性群另类交| 久久人人爽人人爽人人片ⅴ| 久久精品国产再热青青青| 蜜臀av无码一区二区三区| 普陀区| 99热在线精品国产观看| 精品亚洲成a人在线看片| 午夜影视啪啪免费体验区入口| 高潮呻吟国产在线播放| 国产69精品久久久久久妇女迅雷 | 麻豆国产成人av在线播放欲色| 人妻无码av中文系列久| 电影 国产 偷窥 亚洲 欧美 | 日本不卡在线视频二区三区| 赤城县| 国产精品无圣光一区二区| 国产人与zoxxxx另类| 九九热免费在线视频| 熟女精品视频一区二区三区| 一本色综合亚洲精品蜜桃冫| 国产精品女熟高潮视频| 嗯~进去~好大~好满视频| 都匀市| 国产香蕉国产精品偷在线| 精品日韩欧美一区二区在线播放 | 中年国产丰满熟女乱子正在播放| 丰满人妻被黑人猛烈进入| 亚洲性影院| 四虎国产精品免费久久| 久久精品国产免费观看三人同眠| 国产91丝袜在线播放动漫| 四虎国产精品永久在线|