go| go 性能優(yōu)化入門之「Go代碼重構(gòu):23倍的性能爆增」實(shí)踐

最近在整理以前攢的 go 語言學(xué)習(xí)資料 -- 可能很多人都和我一樣, 隨手一個(gè)收藏, 不動(dòng)手也不深入, 然后就過去了. 這次從故紙堆里掃出來, 當(dāng)然不能錯(cuò)過

資料:

學(xué)習(xí)到的知識(shí):

  • 使用 go test 進(jìn)行 單測/壓測
  • 使用 go tool 進(jìn)行 prof/trace
  • 性能問題 debug 與優(yōu)化思路

let's party

cd bad
?  bad git:(master) ? go test -bench=. -cpuprofile cpu.prof
goos: darwin
goarch: amd64
pkg: test/bad
BenchmarkParseAdexpMessage-8       18999         63848 ns/op
PASS
ok      test/bad    2.007s
  • bad & good 代碼對比: good 更慣用,更易讀,利用go語言的細(xì)節(jié), 后續(xù)的修改都基于 good 代碼進(jìn)行

  • 查看 trace, 查看 CPU 使用情況

# 使用 trace 工具
go test -bench=. -trace trace.out
go tool trace trace.out # 會(huì)在默認(rèn)瀏覽器中打開 trace
image
  • trace 分析: 放大 CPU 部分 -> 數(shù)千個(gè)小的彩色計(jì)算切片 + 空閑插槽 -> 一些核心處于空閑狀態(tài)

  • 首先進(jìn)行競爭檢測, 如果發(fā)生競爭, 比性能問題更嚴(yán)重

# 競爭檢測
go test -race
// 改動(dòng)就一行
for _, line := range in {
    // go mapLine(line, ch)
    mapLine(line, ch)
}
  • 使用 cpuprof, 查看熱函數(shù)調(diào)用, 定位到瓶頸
# 1. 生成 cpuprof
go test -bench=. -cpuprofile cpu.prof
# 2. 生成 svg
go tool pprof -svg cpu.prof > cpu.svg
# 3. 使用 chrome 打開 svg 文件即可
image

寫在最后

總算把一個(gè)很久很久之前的坑給填上了, 開心??

  • prof 相關(guān): 可以定位熱點(diǎn)函數(shù), 方便定位瓶頸
go test -bench=. -cpuprofile cpu.prof # 壓測, 生成 prof 文件
go tool pprof -svg cpu.prof > cpu.svg # 使用 prof 工具, prof 轉(zhuǎn)為 svg, svg 可以使用 chrome 打開
  • trace 相關(guān): 可以查看 cpu 使用狀態(tài)
go test -bench=. -trace trace.out
go tool trace trace.out
  • goroutine 相關(guān)

首先要區(qū)分 CPU密集型任務(wù)/IO密集型任務(wù), 協(xié)程更適合處理 IO密集型任務(wù), 減少 IO wait 導(dǎo)致的 CPU 空轉(zhuǎn), 其次協(xié)程過多會(huì)導(dǎo)致協(xié)程調(diào)度的開銷, 同樣會(huì)造成性能損失

  • 推薦使用 github desktop

切換分支, 查看 commit, so easy ~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容