一、gprof的概述
gprof是一種使用逆向工程的方法來分析程序性能的工具。一般用來分析函數的耗時,包括哪些函數被調用多少次及執行時間,以及函數之間的調用關係等等。
正如可以使用GNU GCC編譯器中的 -pg 選項來生成 profil 數據文件一樣,gprof 也會讀取這個文件並進行分析。gprof 將會生成一個程序的性能概覽報告,包括耗時比例和函數調用關係。在可視化的表格形式中,直觀展示出程序運行的時間。
二、gprof基本用法
下面是一個簡單的C++代碼示例:
#include <iostream> #include <cstdlib> using namespace std; void functionC(); void functionB(); void functionA(); int main(int argc, char* argv[]) { for(int i=0;i<500;i++) { functionA(); } return 0; } void functionA() { functionB(); functionC(); } void functionB() { int t = rand()%10000; for(int i=0;i < t; i++); } void functionC() { int t = rand()%50000; for(int i=0;i < t; i++); }
為了生成 gprof 報告,首先需要編譯主程序,使用 -pg 選項來生成 profiler 數據文件。
g++ -pg main.cpp -o my_app
然後運行程序:
./my_app
在運行後,gprof 所需的數據文件 my_app.gmon 會被生成。
最後使用 gprof 來分析程序:
gprof my_app
gprof 將生成一個報告文件 gprof 輸出給標準輸出。也可以通過 -b 選項將其輸出到一個文件中,如:
gprof my_app -b report.txt
三、gprof的輸出內容
gprof 的輸出可以分為兩部分。第一部分是概述部分,它展示了程序的總體運行情況,包括總運行時間、每個函數運行時間、每個函數運行所佔百分比、以及一個簡單的調用圖示例。以下是輸出的示例:
flat % cum % ... 6.02 28.00% 18.98 88.15% functionC 2.96 13.70% 2.96 13.70% functionB 9.56 44.30% 28.94 134.06% functionA ... Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls ms/call ms/call name 23.14 26.34 26.34 1 26340.00 26340.00 functionB 29.17 47.73 21.39 1 21390.00 21390.00 functionC 47.49 100.00 52.27 1 52270.00 52270.00 functionA
在這個示例中,我們可以看到 3 個函數的概述信息和詳細信息。每個函數的詳細信息包括運行時間、被調用次數,以及被調用的總時間。需要注意的是,調用時間是遞歸地計算的。即如果函數 A 調用 B,B 調用 C,那麼調用 A 的時間將包含 A、B、C 的總時間。
例如,在這個示例中,函數 A 的運行時間是 28.94 s,其中包括函數 B 和 C 的時間。由於函數 A 調用了 B 和 C,所以被調用的總時間是 52.27 s。另外,由於函數 B 和 C 都是 A 調用的,所以它們的累計時間也包含在 A 的總時間中。
四、gprof配置參數
除了 -pg 選項外,gprof 還可以接受其他一些參數來控制其行為。
1. -p 參數用來控制輸出的詳細程度。其值可以是 NONE、FLAT、GRAPH 或 ALL。DEFAULT 是 FLAT GRAPH。
2. -a 和 -q 選項用來忽略或包含所有函數,包括靜態函數。默認情況下,gprof 會跳過靜態函數。
3. -S 參數可以用來指定彙編源代碼,以便 gprof 可以在彙編級別計算函數調用關係和時間。
五、優化代碼以使用 gprof
在編寫代碼時,可以使用一些技巧來優化程序以便更好地使用 gprof。以下是一些提示:
1. 添加調試信息。gprof 會分析程序中函數間的調用關係,添加足夠詳細的調試信息將會使報告更準確。例如,使用 -g 選項編譯程序可以在可執行文件中添加調試信息。
2. 減小程序規模。如果程序很大,gprof 將會分析所有函數,這會耗費大量時間和空間。因此,在進行性能分析時應該只分析感興趣的部分或者將程序分解為更小的部分。
3. 避免函數重複調用。如果同一個函數被多次調用,gprof 將會將其計算多次,這會導致時間的重複記錄。因此,在程序設計時應該避免這種情況。一種可能的解決方法是將被重複調用的函數內聯,這樣gprof就無需記錄其調用。
六、結論
gprof 是一種強大的性能分析工具,可以用來分析程序的性能瓶頸和調試錯誤。通過使用gprof來分析程序,能夠得出程序的函數耗時比例和函數調用關係。但是需要注意的是,gprof 的分析結果取決於所使用的硬體和操作系統等環境因素。
原創文章,作者:QGRDJ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/332444.html