2 回答

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

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