2010-01-10 71 views
1

有許多靜態和動態儀表工具。 Soot是Java字節碼的靜態檢測工具。 Pin和Valgrind是二進制文件的動態檢測工具。靜態和動態儀表的優點/缺點

靜態和動態儀表工具有什麼優點和缺點?我認爲靜態檢測工具在運行時性能方面更好,而動態工具更強大。請在能力和表現方面進行比較。

另外,使用儀器工具編寫LLVM pass有什麼區別?

回答

2

我假設需要發現花費大量時間的代碼,並且可以優化以節省時間。這是與定時例程不同的目標。

我對靜態分析器持懷疑態度,因爲一切都取決於輸入數據組合。

動態檢測嘗試測量函數的屬性,例如:自我時間和總時間,絕對值,平均值和百分比。也調用計數,並調用每個例程在調用圖中的角色。

動態儀表(a la gprof)幾十年來一直是事實上的標準,但它遠非最後一個詞。首先,重要的是要認識到,它提供給你的大部分統計數據都不符合你的原始需求。

這些天(恕我直言)你需要一個採樣分析器,採樣調用堆棧,而不僅僅是程序計數器。它應該在掛鐘時間採樣,而不僅僅是CPU時間。樣品不需要高頻率繪製。它應該在應用等待用戶輸入時抑制採樣。它應該爲您提供線路或指令級別的信息,而不僅僅是功能級別。它應該給你的一行代碼最重要的統計數據是包含它的樣本的百分比,因爲如果該行被優化,那麼這是可以節省時間的最直接的度量。

一些分析器可以做到這一點,特別是Oprofile和RotateRight/Zoom。

+0

這個答案主要是討論* profilers *,它給你關於你的程序在哪裏花費時間的詳細信息。性能分析只是一個用例*,用於檢測您的程序。 – Karmastan 2010-11-08 15:23:38

+0

@Karmastan:謝謝。通常,尋找性能和內存問題是主要的問題。答案表明,這是以績效爲問題。我可以看到哪裏可能想回答其他與正確性有關的問題。 – 2010-11-08 16:41:23

1

靜態檢測的優點在於分析不依賴於輸入。分析發生在原始代碼上,幷包含代碼的所有路徑。完全覆蓋。這種類型的檢測通常重寫準備好執行的二進制文件,而不需要運行時的另一個進程。這也意味着代碼將運行得很快,唯一的開銷來自注入的代碼。靜態儀器的缺點是由於缺少運行時信息而導致的不詳細分析,因此有時很難實現您的目標。

另一方面,動態檢測包括代碼運行期間的每個細節和信息。在大多數情況下,執行動態檢測的工具很容易編寫。另一方面,由於執行路徑依賴於給定的輸入,因此無法實現完整的代碼覆蓋。此外,需要附加外部程序並將原始程序加載到儀器上會使速度變慢。

AFAIC,LLVM通道用於靜態檢測,因爲生成的代碼在編譯時已經寫入最終的二進制文件,並且確實包含了靜態檢測技術的所有優點和缺點。

總之,這是你需要的。你應該爲你的工作選擇正確的工具。