vc6.0 Buile菜單下 Profile的作用

Profile的作用

  幫助你分析並發現程序運行的瓶頸,找到耗時所在,同時也能幫助你發現不會被執行的代碼。從而最終實現程序的優化。

Profile的組成

   Profile包括3個命令行工具:PREP,PROFILE,PLIST。可以以命令行方式運行Profile,其過程是:PREP讀取應用程序的可執行文件並生成一個.PBI文件和一個.PBT文件;PROFILE根據.PBI文件,實際運行並分析程序,生成.PBO輸出文件;PREP再根據.PBO文件和.PBT文件,生成新的.PBT文件;PLIST根據.PBT文件生成可閱讀的輸出。

Profile的具體功能

   - Function timing:對程序花費在執行特定函數上的時間進行評估。可以通過Profile對話框激活該功能。分析結果中,Func Time一欄以秒爲單位記錄了函數運行所花時間,下一欄顯示了該函數時間佔總運行時間的百分比;Func+Child Time欄記錄了函數及其所調用的子函數運行所花的總時間,下一欄顯示了前述時間佔總運行時間的百分比;Hit Count欄記錄函數被調用的次數;Function欄顯示函數的名稱。

 

   - Function coverage:記錄特定函數是否被調用,可以用來確定代碼中的未執行部分。可以通過Profile對話框激活該功能。分析結果列出所有被分析的函數,並使用*號標記執行過的函數。

 

   - Function counting:記錄程序調用特定函數的次數。在Profile對話框中選擇Custom,並在Custome Settings中指定fcount.bat(位於VC98\bin目錄下)。需要注意的是,在指定fcount.bat所在目錄時,最好不要用長文件名的方式,這樣有可能出錯,比如要將c:\Program Files寫成c:\Progra~1。

 

   - Line counting:記錄程序所執行的代碼中特定行的次數。在Profile對話框中選擇Custom,並在Custome Settings中指定lcount.bat(位於VC98\bin目錄下)。該功能使用.EXE中的調試信息啓動Profile,因此不需要.MAP文件。分析結果中,Line欄標示源代碼的行號,Hit Count欄記錄該行執行次數,下一欄顯示了該行執行次數佔所有代碼行執行次數的百分比,Source Line顯示了對應的源代碼。

 

   - Line coverage:記錄代碼中的特定行是否被執行,可以用來確定代碼中的未執行部分。可以通過Profile對話框激活該功能。分析結果列出所有被分析的代碼行,並使用*號標記執行過的行。由於Line coverage只記錄代碼行是否被執行過,所以其執行開銷要比Line counting小。

 

  此外,Profile對話框還提供了Merge功能,用以把多次運行Profile之後的統計結果組合起來。如果你正在使用Function coverage功能,則會看到是否測試了所有函數;如果你正在使用Function timing功能,則會看到以往分析與本次分析所有合併運行的累計時間。

IDE環境下Profile的使用

   - 對於涉及函數分析的功能

  • 選擇Project->Settings->Link,選擇Enable profiling複選框
  • 重建項目
  • 選擇Build->Profile,彈出Profile對話框
  • 做必要設置後,選擇OK,開始運行程序

 

   - 對於涉及行分析的功能

  • 選擇Project->Settings->Link,選擇Enable profiling複選框和Generate debug info複選框
  • 選擇Project->Settings->C/C++,選擇Line Numbers Only
  • 重建項目
  • 選擇Build->Profile,彈出Profile對話框
  • 做必要設置後,選擇OK,開始運行程序

配置Profile的三種方式

   - 修改profiler.ini文件

 

   profiler.ini位於VC98\bin目錄下,在其[profiler]段中,你可以指定不參與分析的LIB文件或OBJ文件。比如:

 
[profiler]
exclude:user32.lib
exclude:gdi32.lib
 
 

   - 在Profile對話框中指定選項

 

  若你選擇了Funciton timing、Function coverage或Line coverage選項,則你可以在Advanced settings中指定進一步的範圍,比如:你希望Profile只分析SampleApp.cpp文件中特定範圍內的代碼,可以在Advanced settings中填入,/EXCALL /INC SampleApp.cpp(30-67)。又如:你希望file1.obj和file2.obj不參與分析,則可以在Advanced settings中填入, /EXC file1.obj /EXC file2.obj 。再如:你希望只描述指定函數,則可以在Advanced settings中填入, /SF ?SampleFunc@@YAXPAH@@ ,緊跟SF參數的是特定函數的修飾符名,獲取該名稱的最簡單的方式是在創建項目時生成的MAP文件中查找。

 

   SF,EXCALL,EXC,INC都是PREP的命令行參數,有關其他參數的詳細說明可以通過在命令行提示符輸入PREP /H得到。

 

   - 編寫批命令文件

 

  可以參考fcount.bat、fcover.bat、ftime.bat、lcount.bat以及lcover.bat

從Profile中輸出數據

   PLIST /T命令允許PLIST將.PBT文件內容以製表格式輸出到文本文件中,該格式適合輸入到電子表格或數據庫中。比如:PLIST /T MYPROG > MYPROG.TXT,生成的MYPROG.TXT可以利用profiler.xlm(位於VC98\bin目錄下)導入到Microsoft Excel電子表格中。

注意

   - 通常,分析整個程序的意義不大,因爲大多數Windows應用程序,主要時間花費在消息等待上,因此精確定位要分析的代碼,可以加快Profile的執行速度,提高其分析準確度。在Profile執行期間儘量關閉其他不相干的應用程序。

 

   - 若啓用了遠程調試,則不能夠從Build菜單中調用Profile功能。

 

   - 對於inline函數,編譯器以實際代碼替換函數調用,因此inline函數不生成.MAP文件或CALL指令,所以當執行這樣的函數時,Profile將無法得知,花費時間、運行次數等數據都歸屬於調用該函數的函數。Profile可以提供有關inline函數的行一級的運行次數和覆蓋信息。

 

   - 對於多線程應用程序,Profile的行爲取決於你所選擇的分析方式,對於Line counting和Line coverage,Profile並未區分線程之間有何不同,它將包含當前運行的所有線程。對於Function timing、Function coverage和Function counting,分析結果取決於線程,你可以用以下方式分析一個獨立線程:

  • 將線程的主函數聲明爲初始函數(用PREP /SF選項)
  • 包含程序中的所有函數(不要使用PREP /EXC選項)

 

  否則,分析結果很難解釋。

 

   (完)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章