2 回答

TA貢獻1806條經驗 獲得超5個贊
您可以使用 pprof組合:
概要分析,它可以幫助您了解誰調用了什么,調用了多長時間
(ofabry/go-callvis
也可以幫助查看調用圖)
它的 Weblist 視圖顯示了每條已執行的行及其成本:
請參閱本指南中的“交互式分析” 。
這不會顯示按順序執行的每一行,但允許您在運行后探索執行的內容。
請注意,Go 1.20/1.21(2022 年第 4 季度/2023 年第 2 季度)將包括(因為接受了#55022):
Go 的配置文件引導優化 (PGO)
Go 程序中的低效率可以通過分析工具(例如
pprof
linux profiler )來隔離perf
。此類工具可以查明花費大部分執行時間的源代碼區域。與其他優化編譯器(如 LLVM)不同,Go 編譯器尚未執行Profile-Guided Optimization(PGO)。
PGO 使用有關代碼運行時行為的信息來指導編譯器優化,例如內聯、代碼布局等。PGO 可以將應用程序性能提高 15-30% [LLVM、AutoFDO]。在這個提案中,我們用 PGO 擴展了 Go 編譯器。
具體來說,我們將配置文件合并到編譯器的前端,以構建具有節點和邊權重(稱為
WeightedCallGraph
)的調用圖。Inliner 隨后使用WeightedCallGraph
來執行配置文件引導的內聯,該內聯積極地內聯熱函數。我們引入了一個配置文件引導的代碼專業化通道,它與 Inliner 緊密集成,并消除了熱代碼路徑中的間接方法調用開銷。
此外,我們使用相關的配置文件權重注釋 IR 指令,并將這些指令傳播到 SSA 級別,以促進配置文件引導的基本塊布局優化,從而從更好的指令緩存和 TLB 性能中獲益。
最后,我們擴展了 Go 的鏈接器以直接使用配置文件并跨包邊界執行函數重新排序優化——這也有助于指令緩存和 TLB 性能。
pprof
我們的 PGO 使用的配置文件格式與該工具生成的 protobuf 格式相同。這種格式足夠豐富,可以攜帶額外的硬件性能計數器信息,例如緩存未命中、LBR 等。Google
現有perf_data_converter
的工具可以將perf.data
Linuxperf
生成的profile.proto
文件轉換為 protobuf 格式的文件。
Go 中將針對 PGO 提出一個新的編譯流程

TA貢獻1845條經驗 獲得超8個贊
由于 Go 是一種編譯語言,可執行文件不包含任何原始源代碼,因此無法輸出。您最接近您想要的方法是在調試模式下運行您的 Go 項目并單步執行每一行代碼。
這樣你就可以在運行時決定跳轉到一個函數或者只是執行它并跳過它,因為調試器不會知道你認為什么是“標準庫”,什么應該逐行跟蹤,什么不是。
另一方面,Go 可以是帶有 go 例程的大量多線程,因此打印每條執行的行可能會在一分鐘內變得一團糟(有時我有超過 100 個例程同時運行)。
- 2 回答
- 0 關注
- 122 瀏覽
添加回答
舉報