日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Go 学习笔记(81)— Go 性能分析工具 pprof

發布時間:2023/11/28 生活经验 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go 学习笔记(81)— Go 性能分析工具 pprof 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Go 語言工具鏈中的 go pprof 可以幫助開發者快速分析及定位各種性能問題,如 CPU消耗 、內存分配及阻塞分析 。具體作用如下:

性能分析首先需要使用 runtime.pprof 包嵌入到待分析程序的入口和結束處 。runtime.pprof 包在運行時對程序進行每秒 100 次的采樣,最少采樣 1 秒。然后將生成的數據輸出 , 讓開發者寫入文件或者其他媒介上進行分析。

go pprof 工具鏈配合 Graphviz 圖形化工具可以將 runtime.pprof 包生成的數據轉換為 PDF格式,以圖片的方式展示程序的性能分析結果 。

1. 安裝 Graphviz

Graphviz 是一套通過文本描述的方法生成圖形的工具包。描述文本的語言叫做 DOT 。在 www.graphviz.org 網站可以獲取到最新的 Graphviz 各平臺的安裝包 。

CentOS下,可以使用 yum 指令直接安裝 :

yum install graphviz

Ubuntu

sudo apt-get install graphviz

其它平臺安裝方式可參考: https://www.graphviz.org/download/

2. 安裝第三方包

runtime.pprof 提供基礎的運行時分析的驅動,但是這套接口使用起來還不是太方便,例如:

  • 輸出數據使用 io.Writer 接口,雖然擴展性很強, 但是對于實際使用不夠方便,不支持寫入文件;
  • 默認配置項較為復雜;

很多第三方的包在系統包 runtime.pprof 的技術上進行便利性封裝,讓整個測試過程更為方便。這里使用 github.com/pkg/profile 包進行例子展示,使用下面代碼安裝這個包:

go get github.com/pkg/profile

3. 性能分析示例

cpu.go 代碼內容:

package mainimport ("time""github.com/pkg/profile"
)func joinSlice() []string {var arr []string// 為了進行性能分析,這里在己知元素大小的情況下,還是使用 append()// 函數不斷地添加切片。性能較低,在實際中應該避免,這里為了性能分析,故意這樣寫。for i := 0; i < 1000000; i++ {arr = append(arr, "arr")}return arr
}func main() {// 開始性能分析, Start 參數都是可選項,指定的分析項目是profile.CPUProfile// profile.ProfilePath(".") 指定輸出的分析文件路徑,// profile.Start 返回一個停止接口stopper := profile.Start(profile.CPUProfile, profile.ProfilePath("."))// 在main結束時停止性能分析defer stopper.Stop()// 分析的核心邏輯joinSlice()// 為了保證性能分析數據的合理性,分析的最短時間是 1 秒,使用 time.Sleep()//	在程序結束前等待 1 秒。如果你的程序默認可以運行 1 秒以上,這個等待可以去掉 。time.Sleep(time.Second)
}

性能分析需要可執行配合才能生成分析結果,因此使用命令行對程序進行編譯,步驟如下:

go build  -o cpu cpu.go			
./cpu												# 運行可執行文件,在當前目錄下生成 cpu.pprof
go tool pprof  --pdf cpu cpu.pprof > cpu.pdf	

使用 go tool 工具鏈輸入 cpu.pprofcpu 可執行文件,生成 PDF 格式的輸出文件,將輸出文件重定向為 cpu.pdf 文件。這個過程中會調用 Graphviz 工具。
?

4. PDF 結果

每一個框為一個函數調用的路徑,第 3 個方框中 joinSlice 函數耗費了 76% 的 CPU 時間,存在性能瓶頸。

重新優化代碼, 在己知切片元素數量的情況下直接分配內存,代碼如下:

func joinSlice() []string {const count = 1000000var arr = make([]string, count)for i := 0; i < count; i++ {arr[i] = "arr"}return arr
}

5. 實戰案例

https://github.com/wolfogre/go-pprof-practice
https://blog.wolfogre.com/posts/go-ppof-practice/

總結

以上是生活随笔為你收集整理的Go 学习笔记(81)— Go 性能分析工具 pprof的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。