最近在linux環境下分析程序的性能,主要應用profile工具集。網上網羅了一些資料,按部就班的進行了一些實驗,也得出了一些結果。
其中,用到了valgrind中的memcheck、callgrind。實驗了linux自帶的gprof 與oprof。最終通過使用callgrind與gprof2dot結合使用,得出程序的調用次數與函數佔比等關係圖。
以下分享下具體的步驟:
1)首先是環境及工具準備。安裝valgrind,下載gprof2dot.py 腳本 ,下載安裝graphviz
2)啓動運行callgrind。 valgrind --tool=callgrind ./test
3)運行完成後會當前目錄下生成callgrind.out.***的文件
4)運行gprof2dot.py -f callgrind callgrind.out.****|dot -Tpng -o report.png 在當前目錄下生成report.png
report.png 就是我們希望得到的結果。
下面寫了個測試例子:
int b(void) {
int i=0,g=0;
while(i++<400000)
{
// c();
g+=i;
}
return g;
}
int main(int argc, char** argv)
{
int iterations;
if(argc != 2)
{
printf("Usage %s <No of Iterations>\n", argv[0]);
return 0;
}
else
iterations = atoi(argv[1]);
printf("No of iterations = %d\n", iterations);
while(iterations--)
{
a();
b();
}
}
每個方框內部顯示函數名稱,函數整體包括內部子函數佔用時間%比,函數自身,不包括內部子函數佔用時間%比,函數執行次數。邊表示父函數調用該子函數佔用的時間%比,調用次數。從圖中可以看出函數佔用時間開銷,調用次數等開發者。