2 回答
TA貢獻1806條經(jīng)驗 獲得超5個贊
您可以使用 pprof組合:
概要分析,它可以幫助您了解誰調用了什么,調用了多長時間

(ofabry/go-callvis也可以幫助查看調用圖)
它的 Weblist 視圖顯示了每條已執(zhí)行的行及其成本:

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

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