2012-08-14 91 views

回答

1

我不熟悉的命名廓線儀,但有兩個主要的方法來分析:

儀表,這種方法通常需要重新編譯(並不總是,例如Java和.NET應用程序可以動態儀表)。通過這種方法,可以精確地測量例程被調用的頻率,或某個循環所做的迭代次數。

Sampeling是一種不需要任何重新編譯的方法,它只是以設定的時間間隔對堆棧進行快照。這已被證明是找到瓶頸的有效方法。

還有一些關於這兩種策略的更多信息here

1

我至少可以在Valgrind和gprof上發言。

使用這兩者之間的主要差異基本上是你已經說過的。對於gprof,您必須專門編譯它以包含分析代碼。當您運行可執行文件時,將執行分析代碼(因爲它已內置到您的程序中),並創建一個gmon.out文件,然後可以通過gprof處理該文件,以向您顯示程序的運行時統計信息。

Valgrind的不同之處在於,您不需要以任何特殊的方式編譯程序(除了要添加調試符號(如果希望輸出有用))。 Valgrind將您的程序動態轉換爲在模擬CPU上運行的內部格式(儘管這是)。這意味着任何程序都可以通過Valgrind運行,而無需特殊編譯。

另一個重要的區別是Valgrind可以報告比gprof更多的信息,但這與使用它無關。

0

任何分析技術都需要符號表信息,因此必須在編譯和鏈接中進行請求。

除此之外,一些分析器通過在每個函數的開始和可能結束時編譯記錄保存例程來調用。 這些函數可以嘗試記錄函數使用的時間,以及它從哪裏被調用的某些記錄。 調用這些錄音功能的開銷使其時序數據不準確。

其他分析器不需要這樣做,而是依靠定期的調用堆棧樣本。 這樣一個分析器的開銷較低。 其採樣的統計特性使其時序數據不準確。

這裏隱含的是,定位的準確性對於定位「瓶頸」是必需的,據我所知,這從來沒有被證明是真實的。 method I've always used要獲得數量級的加速依賴於深入瞭解程序在花費時間做什麼,而不是花費多少時間。如果你對統計原理感興趣,你可以look here

相關問題