2015-06-08 56 views
2

我已經開始使用Kcachegrind進行性能分析。但我不明白GUI和輸出圖。如何解釋Kcachegrind圖?

例如,對於這個調用圖

enter image description here SignatureIterator::iterate_parameters()我不明白什麼是9.25%指的是? 5 198x表示SignatureIterator::iterate_parameters()調用SignatureIterator::parse_type()多少次? Symbol::byte_at(int) const中100%是什麼意思? 什麼是ELF Object

注意:在官方文檔http://kcachegrind.sourceforge.net/html/CallGraph.html,但仍不明白什麼是the caller distance to the function

+0

函數A調用函數B之間的距離是A-> C-> T-> B之間的子函數的數量,在這種情況下A和B之間的距離是2. – Bionix1441

回答

7

KCachegrind中的所有可視化都以當前選定的函數爲中心,這裏是Symbol::byte_at()。通常,所選函數的百分比數字與總成本(有史以來的運行時間/週期)相關。但是,如果啓用模式/工具按鈕「相對於父級」,則調用圖表中的百分比數字會「縮小」以顯示所選功能的100%,以便更容易查看其他功能花費的比例,相對於所選的一個。

我們假設成本(即在KCachegrind中選擇的事件類型)是時間(以CPU週期或毫秒爲單位 - 與百分比無關)。這使得它可能更易於理解。

呼叫圖表中的百分比總是顯示在某個給定函數花費而選擇的功能(Symbol::byte_at)是活躍,即時間。在程序運行期間可以在調用堆棧中找到這兩個函數的時間。這適用於被叫方向(向下Symbol::byte_at())和來電方向(向上Symbol::byte_at())。

向下,這更容易理解:雖然Symbol::byte_at()處於活動狀態,但該處理器實際上正在執行代碼的時間的百分比爲24.14%,這些代碼從Symbol::base()開始執行。另一次(100% - 24.14%),Symbol::byte_at()本身的代碼正在運行。

在所選功能的上方,它可能有點棘手。 例如,SignatureIterator::iterate_parameters()的9.25%表示在Symbol::byte_at()處於活動狀態的時間內,其間的9.25%是間接從SignatureIterator::iterate_parameters()調用的時間。同樣,Symbol::byte_at()被稱爲從SignatureIterator::parse_type()直接運行的時間的11.27%。也就是說,在所選函數的上方,函數的直接父項中的百分比總是與該函數的確切百分比相加,除非由於低於可見性閾值(請參見上下文菜單)而使功能從可視化中斷, 。

+0

非常好的解釋,謝謝。唯一缺少的東西(以及我還沒完全掌握的那個)是_recursive_調用旁邊的欄。他們似乎沒有遵循解釋的模式,因爲它們的價值大於所選函數的價值 - 在上述方案中這是不可能的。 – stefanct