av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

創(chuàng)新互聯(lián)GO教程:gopprof命令(Go語言性能分析命令)完全攻略

Go語言工具鏈中的 go pprof 可以幫助開發(fā)者快速分析及定位各種性能問題,如 CPU 消耗、內(nèi)存分配及阻塞分析。

十多年專注成都網(wǎng)站制作,成都企業(yè)網(wǎng)站建設(shè),個(gè)人網(wǎng)站制作服務(wù),為大家分享網(wǎng)站制作知識(shí)、方案,網(wǎng)站設(shè)計(jì)流程、步驟,成功服務(wù)上千家企業(yè)。為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),專注于成都企業(yè)網(wǎng)站建設(shè),高端網(wǎng)頁制作,對(duì)茶藝設(shè)計(jì)等多個(gè)領(lǐng)域,擁有豐富的網(wǎng)站制作經(jīng)驗(yàn)。

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

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

安裝第三方圖形化顯式分析數(shù)據(jù)工具(Graphviz)

Graphviz 是一套通過文本描述的方法生成圖形的工具包。描述文本的語言叫做 DOT。

在  www.graphviz.org 網(wǎng)站可以獲取到最新的 Graphviz 各平臺(tái)的安裝包。

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

$ yum install graphiviz

安裝第三方性能分析來分析代碼包

runtime.pprof 提供基礎(chǔ)的運(yùn)行時(shí)分析的驅(qū)動(dòng),但是這套接口使用起來還不是太方便,例如:

  • 輸出數(shù)據(jù)使用 io.Writer 接口,雖然擴(kuò)展性很強(qiáng),但是對(duì)于實(shí)際使用不夠方便,不支持寫入文件。
  • 默認(rèn)配置項(xiàng)較為復(fù)雜。

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

$ go get github.com/pkg/profile

性能分析代碼

下面代碼故意制造了一個(gè)性能問題,同時(shí)使用 github.com/pkg/profile 包進(jìn)行性能分析。

本套教程所有源碼下載地址: https://pan.baidu.com/s/1ORFVTOLEYYqDhRzeq0zIiQ    提取密碼:hfyf

基準(zhǔn)測(cè)試代碼如下(具體文件:./src/chapter11/profile/cpu.go):

package main

import (
    "github.com/pkg/profile"
    "time"
)

func joinSlice() []string {

    var arr []string

    for i := 0; i < 100000; i++ {
     // 故意造成多次的切片添加(append)操作, 由于每次操作可能會(huì)有內(nèi)存重新分配和移動(dòng), 性能較低
        arr = append(arr, "arr")
    }

    return arr
}

func main() {
    // 開始性能分析, 返回一個(gè)停止接口
    stopper := profile.Start(profile.CPUProfile, profile.ProfilePath("."))

    // 在main()結(jié)束時(shí)停止性能分析
    defer stopper.Stop()

    // 分析的核心邏輯
    joinSlice()

    // 讓程序至少運(yùn)行1秒
    time.Sleep(time.Second)
}

代碼說明如下:

  • 第 4 行,引用 github.com/pkg/profile 第三方包封裝。
  • 第 14 行,為了進(jìn)行性能分析,這里在已知元素大小的情況下,還是使用 append() 函數(shù)不斷地添加切片。性能較低,在實(shí)際中應(yīng)該避免,這里為了性能分析,故意這樣寫。
  • 第 22 行,使用 profile.Start 調(diào)用 github.com/pkg/profile 包的開啟性能分析接口。這個(gè) Start 函數(shù)的參數(shù)都是可選項(xiàng),這里需要指定的分析項(xiàng)目是 profile.CPUProfile,也就是 CPU 耗用。profile.ProfilePath(".") 指定輸出的分析文件路徑,這里指定為當(dāng)前文件夾。profile.Start() 函數(shù)會(huì)返回一個(gè) Stop 接口,方便在程序結(jié)束時(shí)結(jié)束性能分析。
  • 第 25 行,使用 defer,將性能分析在 main() 函數(shù)結(jié)束時(shí)停止。
  • 第 28 行,開始執(zhí)行分析的核心。
  • 第 31 行,為了保證性能分析數(shù)據(jù)的合理性,分析的最短時(shí)間是 1 秒,使用 time.Sleep() 在程序結(jié)束前等待 1 秒。如果你的程序默認(rèn)可以運(yùn)行 1 秒以上,這個(gè)等待可以去掉。

性能分析需要可執(zhí)行配合才能生成分析結(jié)果,因此使用命令行對(duì)程序進(jìn)行編譯,代碼如下:

$ go build -o cpu cpu.go
$ ./cpu
$ go tool pprof --pdf cpu cpu.pprof > cpu.pdf

代碼說明如下:

  • 第 1 行將 cpu.go 編譯為可執(zhí)行文件 cpu。
  • 第 2 行運(yùn)行可執(zhí)行文件,在當(dāng)前目錄輸出 cpu.pprof 文件。
  • 第 3 行,使用 go tool 工具鏈輸入 cpu.pprof 和 cpu 可執(zhí)行文件,生成 PDF 格式的輸出文件,將輸出文件重定向?yàn)?cpu.pdf 文件。這個(gè)過程中會(huì)調(diào)用 Graphviz 工具,Windows 下需將 Graphviz 的可執(zhí)行目錄添加到環(huán)境變量 PATH 中。

最終生成 cpu.pdf 文件,使用 PDF 查看器打開文件,觀察后發(fā)現(xiàn)下圖所示的某個(gè)地方可能存在瓶頸。



圖:性能分析

圖中的每一個(gè)框?yàn)橐粋€(gè)函數(shù)調(diào)用的路徑,第 3 個(gè)方框中 joinSlice 函數(shù)耗費(fèi)了 50% 的 CPU 時(shí)間,存在性能瓶頸。重新優(yōu)化代碼,在已知切片元素?cái)?shù)量的情況下直接分配內(nèi)存,代碼如下:

func joinSlice() []string {

    const count = 100000

    var arr []string = make([]string, count)

    for i := 0; i < count; i++ {
        arr[i] = "arr"
    }

    return arr
}

代碼說明如下:

  • 第 5 行,將切片預(yù)分配 count 個(gè)數(shù)量,避免之前使用 append() 函數(shù)的多次分配。
  • 第 8 行,預(yù)分配后,直接對(duì)每個(gè)元素進(jìn)行直接賦值。

重新運(yùn)行上面的代碼進(jìn)行性能分析,最終得到的 cpu.pdf 中將不會(huì)再有耗時(shí)部分。


當(dāng)前文章:創(chuàng)新互聯(lián)GO教程:gopprof命令(Go語言性能分析命令)完全攻略
網(wǎng)站網(wǎng)址:http://uogjgqi.cn/article/cosegig.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流