Ming-Hung Tsai

@mingnus

Joined on Sep 24, 2016

  • Summary gprof 處理 call graph 的方式只考慮單一 edge, 而不是整條 call path, 導致其只能用估算的方式得知各 caller 佔用的 children time, 也無法正確判斷 recursive call e.g., 假設一程式含有以下 call path: A -> C, B -> C, 及 C -> D, 我們會想知道 function A 與 B 各自引發幾次 D, 以及佔用的時間比例? gprof 計算方式是, 假設每條 call path (edge) 發生機率都是 100%, 但忽略了部份 function 可能會提早結束的事實. 這個假設意即: A & B 一定會走到 C, 且若 C 沒有其他 callee, 則 call path A -> C -> D 發生次數等同於 A 呼叫 C 的次數。但這個假設是錯的, 實際上 A -> C 可能只有 50% 的機率會走到 D, 或甚至 call path A -> C -> D 可能根本不存在 gprof 只會採樣 function self-time 及呼叫次數, 其他數值都是估計出來的, 僅供參考 某些需要以 function call 做為 profiling 依據的場合, 就適合用 gprof。例如程式執行時間與輸入資料量不成比例時, 就可以用 gprof 檢查 function call 次數是否異常
     Like 4 Bookmark