gprof(here's the paper)是可靠的,但它only was ever intended to measure changes,甚至爲此,它只測量CPU綁定的問題。它從來沒有被宣傳爲有用的定位問題。這是其他人在其上分層的想法。
考慮this method。
另一個不錯的選擇,如果你不介意花一些錢,是Zoom。
加:如果我可以給你舉個例子。假設你有一個調用層次結構,其中Main調用了一些次數,A調用了一定次數的B,B調用了C次數,而C用一個套接字或文件等待了一些I/O,而這基本上都是該計劃的確如此。現在,進一步假設每個例程調用下一個例程的次數比實際需要的次數多25%。由於1.25^3約爲2,這意味着整個程序需要兩倍的時間才能運行。
首先,因爲所有的時間都花在等待I/O上,所以gprof將不會告訴你這段時間是如何度過的,因爲它只看「運行」時間。
二,假設(僅供參數)確實計算I/O時間。它可以給你一個通話圖,基本上說每個程序都佔用了100%的時間。這是什麼告訴你的?沒有比你已經知道的更多。
但是,如果你採取少量的堆棧樣本,你會看到每一個例程調用下一個代碼的行。 換句話說,它不只是給你一個大概的百分比時間估計,它是指向你昂貴的代碼特定的代碼行。 你可以看看每一行代碼,並詢問是否有辦法做到這一點更少。假設你這樣做,你會得到2加速因子。
人們通過這種方式獲得了很大的因素。根據我的經驗,通話等級的數量可以輕鬆達到30或更多。每個電話似乎必要的,直到你問是否可以避免。即使是少量的可避免的呼叫,也可以在很多層上產生巨大的影響。
我想你也應該提到你的平臺:操作系統,編譯器,gprof的版本等 – 2010-06-02 12:52:27
我發現這篇文章:也許這是一些使用的: http://unix.derkeiler.com/Newsgroups/comp.unix .programmer/2004-03/0938.html – LoudNPossiblyWrong 2010-06-02 12:57:12
您是否嘗試過使用valgrind/kcachegrind來配置文件?我更喜歡它gprof。 – 2010-06-02 12:57:24