使用分析器需要重新編譯源代碼和調試選項(如gprof)和不需要重新編譯的分析器(如Valgrind,OProfile,...)之間有什麼區別?需要重新編譯的分析器和那些不需要的分析器之間有什麼區別?
回答
我不熟悉的命名廓線儀,但有兩個主要的方法來分析:
儀表,這種方法通常需要重新編譯(並不總是,例如Java和.NET應用程序可以動態儀表)。通過這種方法,可以精確地測量例程被調用的頻率,或某個循環所做的迭代次數。
Sampeling是一種不需要任何重新編譯的方法,它只是以設定的時間間隔對堆棧進行快照。這已被證明是找到瓶頸的有效方法。
還有一些關於這兩種策略的更多信息here
我至少可以在Valgrind和gprof上發言。
使用這兩者之間的主要差異基本上是你已經說過的。對於gprof,您必須專門編譯它以包含分析代碼。當您運行可執行文件時,將執行分析代碼(因爲它已內置到您的程序中),並創建一個gmon.out文件,然後可以通過gprof處理該文件,以向您顯示程序的運行時統計信息。
Valgrind的不同之處在於,您不需要以任何特殊的方式編譯程序(除了要添加調試符號(如果希望輸出有用))。 Valgrind將您的程序動態轉換爲在模擬CPU上運行的內部格式(儘管這是慢)。這意味着任何程序都可以通過Valgrind運行,而無需特殊編譯。
另一個重要的區別是Valgrind可以報告比gprof更多的信息,但這與使用它無關。
任何分析技術都需要符號表信息,因此必須在編譯和鏈接中進行請求。
除此之外,一些分析器通過在每個函數的開始和可能結束時編譯記錄保存例程來調用。 這些函數可以嘗試記錄函數使用的時間,以及它從哪裏被調用的某些記錄。 調用這些錄音功能的開銷使其時序數據不準確。
其他分析器不需要這樣做,而是依靠定期的調用堆棧樣本。 這樣一個分析器的開銷較低。 其採樣的統計特性使其時序數據不準確。
這裏隱含的是,定位的準確性對於定位「瓶頸」是必需的,據我所知,這從來沒有被證明是真實的。 method I've always used要獲得數量級的加速依賴於深入瞭解程序在花費時間做什麼,而不是花費多少時間。如果你對統計原理感興趣,你可以look here。
- 1. 爲什麼Lucene QueryParser需要分析器
- 2. 靜態代碼分析器不需要編譯
- 3. 編譯器設計 - 詞法分析:不需要多少列?
- 4. 爲什麼Flurry的分析需要android.permission.ACCESS_NETWORK_STATE
- 5. 不一致的分析和髒讀之間有什麼區別?
- 6. 需要xhprof php分析器的文檔
- 7. JvisualVM中的採樣器和分析器之間有什麼區別?
- 8. 這些Scripts.Render語句之間的編譯器有什麼區別?
- 9. 爲什麼我們需要明確的身體分析器?
- 10. 爲什麼更新到DLL需要重新編譯,有時不需要?
- 11. SRS和需求分析有什麼區別?
- 12. Php分析 - 需要一些建議
- 13. 編譯器和鏈接器之間有什麼區別?
- 14. 爲什麼解析器需要與服務分離?
- 15. 爲什麼分析器需要管理權限(在Windows上)
- 16. 監測和分析之間有什麼區別?
- 17. 我需要分析以下
- 18. 爲什麼不需要重新分配一些對象?
- 19. 不同的編譯器之間有什麼區別
- 20. 需要做些什麼來編譯?
- 21. 需要JSP重新編譯?
- 22. 靜態分析和語義分析有什麼區別?
- 23. 有沒有不需要Python之類的編譯器的Java IDE?
- 24. 爲什麼需要解析?
- 25. poLCA - 潛類分析 - 分析需要多長時間?
- 26. 爲什麼我需要加載JavaScript模塊,所有這些加載器之間有什麼區別?
- 27. 那些需要重新提交
- 28. 需要XML解析器
- 29. 詞法分析器需要「不」而不是「不喜歡」
- 30. 需要幫助分析代碼和分析結果