• <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>

            A Za, A Za, Fighting...

            堅信:勤能補(bǔ)拙

            2011工具-gprof,性能分析

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

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

            gprof分析程序

            gprof對程序進(jìn)行分析主要分以下三個步驟:

            l         用編譯器對程序進(jìn)行編譯,加上-pg參數(shù)。

            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 }


            首先,用以下命令進(jìn)行編譯:

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

            然后,運行可執(zhí)行文件test.

                   [root@localhost]#./test

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

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

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

            這樣就有一大堆信息輸出到屏幕上,有函數(shù)執(zhí)行單間,函數(shù)調(diào)用關(guān)系圖等等,如下:

            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最簡單的使用方法,下面針對其使用過程中的三個步驟詳細(xì)說明。

            編譯和鏈接

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

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

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

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

            運行

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

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

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

            查看

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

                   gprof [可執(zhí)行文件] [gmon.out文件] [其它參數(shù)]

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

            l         -b 不再輸出統(tǒng)計圖表中每個字段的詳細(xì)描述。

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

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

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

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

            l         -f Name 輸出函數(shù)Name 及其子函數(shù)的調(diào)用圖。可以指定多個 -f 標(biāo)志。一個 -f 標(biāo)志只能指定一個函數(shù)。

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

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

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

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

            gprof分析程序

            gprof對程序進(jìn)行分析主要分以下三個步驟:

            l         用編譯器對程序進(jìn)行編譯,加上-pg參數(shù)。

            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 }


            首先,用以下命令進(jìn)行編譯:

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

            然后,運行可執(zhí)行文件test.

                   [root@localhost]#./test

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

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

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

            這樣就有一大堆信息輸出到屏幕上,有函數(shù)執(zhí)行單間,函數(shù)調(diào)用關(guān)系圖等等,如下:

            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最簡單的使用方法,下面針對其使用過程中的三個步驟詳細(xì)說明。

            編譯和鏈接

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

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

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

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

            運行

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

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

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

            查看

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

                   gprof [可執(zhí)行文件] [gmon.out文件] [其它參數(shù)]

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

            l         -b 不再輸出統(tǒng)計圖表中每個字段的詳細(xì)描述。

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

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

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

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

            l         -f Name 輸出函數(shù)Name 及其子函數(shù)的調(diào)用圖。可以指定多個 -f 標(biāo)志。一個 -f 標(biāo)志只能指定一個函數(shù)。

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

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



            轉(zhuǎn)載: http://www.cnblogs.com/huangpeng/archive/2009/02/17/1392456.html

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

            導(dǎo)航

            <2011年8月>
            31123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            統(tǒng)計

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            伊人久久亚洲综合影院| 九九99精品久久久久久| 韩国三级大全久久网站| 久久国产香蕉视频| 国产精品岛国久久久久| 亚洲国产另类久久久精品小说| 亚洲国产天堂久久综合| 国产免费久久久久久无码| 国产精品久久99| 久久精品国产精品亚洲精品| 精品熟女少妇a∨免费久久| 久久久久亚洲精品日久生情| 亚洲欧美日韩久久精品| 久久婷婷五月综合成人D啪| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 国产毛片欧美毛片久久久| 国产精品久久久久蜜芽| 久久婷婷五月综合成人D啪| 久久综合五月丁香久久激情| 久久亚洲AV无码西西人体| 久久久久久极精品久久久| 久久久久国产视频电影| 人妻丰满?V无码久久不卡| 日本精品久久久久久久久免费| 久久久久亚洲?V成人无码| 人妻无码久久精品| 中文国产成人精品久久亚洲精品AⅤ无码精品| 国产精品成人久久久久久久| 久久精品无码一区二区日韩AV| 久久久久久毛片免费看| 一级做a爰片久久毛片看看| 久久99热这里只有精品国产| 亚洲国产另类久久久精品| 77777亚洲午夜久久多喷| 99久久99久久久精品齐齐| 亚洲天堂久久精品| 日日狠狠久久偷偷色综合免费| 久久人妻无码中文字幕| 99久久精品毛片免费播放| 久久久久人妻一区精品果冻| 久久精品国产亚洲AV影院|