最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang?pprof性能測試與分析講解

 更新時間:2023年04月04日 11:37:02   作者:qq_42170897  
剛開始接觸go就遇到了一個內(nèi)存問題,在進行內(nèi)存分析的時候發(fā)現(xiàn)了一下比較好的工具,在此留下記錄,下面這篇文章主要給大家介紹了關于go性能分析工具pprof的性能測試,需要的朋友可以參考下

一、性能分析類型

1.CPU性能分析

CPU性能分析是最常見的性能分析類型。啟動CPU分析時,運行時每隔10ms中斷一次,采集正在運行協(xié)程的堆棧信息。

程序運行結束后,可以根據(jù)收集的數(shù)據(jù),找到最熱代碼路徑。

一個函數(shù)在分析階段出現(xiàn)的次數(shù)越多,則該函數(shù)的代碼路徑(code path)花費的時間占總運行時間的比重越大。

2.內(nèi)存性能分析

內(nèi)存性能分析記錄堆內(nèi)存分配信息,忽略棧內(nèi)存的分配。

內(nèi)存分析啟動時,默認每1000次采樣1次,這個比例是可以調整的。因為內(nèi)存性能分析是基于采樣的,因此基于內(nèi)存分析數(shù)據(jù)來判斷程序所有的內(nèi)存使用情況是很困難的。

3.阻塞性能分析

阻塞性能分析是go特點的。

阻塞性能分析用來記錄一個協(xié)程用來等待共享資源所花費的時間,這用來判斷程序并發(fā)瓶頸是很有用。阻塞的場景包括:

  • 在沒有緩沖的信道上發(fā)送或接受數(shù)據(jù)。
  • 在空的信道上接受數(shù)據(jù)或在滿的信道上發(fā)送數(shù)據(jù)。
  • 嘗試獲取一個已被其他協(xié)程占用的排他鎖。

一般情況下,當所有的 CPU 和內(nèi)存瓶頸解決后,才會考慮這一類分析。

二、cpu性能分析

1.生成pporf

go 性能分析接口位于runtime/pprof 中:

測試代碼:生成5組數(shù)據(jù),進行冒泡排序:

main.go

// main.go
package main
import (
	"math/rand"
	"time"
)
func generate(n int) []int {
	rand.Seed(time.Now().UnixNano())
	nums := make([]int, 0)
	for i := 0; i < n; i++ {
		nums = append(nums, rand.Int())
	}
	return nums
}
func bubbleSort(nums []int) {
	for i := 0; i < len(nums); i++ {
		for j := 1; j < len(nums)-i; j++ {
			if nums[j] < nums[j-1] {
				nums[j], nums[j-1] = nums[j-1], nums[j]
			}
		}
	}
}
func main() {
	n := 10
	for i := 0; i < 5; i++ {
		nums := generate(n)
		bubbleSort(nums)
		n *= 10
	}
}

想要度量這段代碼的性能,只需要在main函數(shù)最前加兩行代碼:

main()

import (
	"math/rand"
	"os"
	"runtime/pprof"
	"time"
)
func main() {
	pprof.StartCPUProfile(os.Stdout)
	defer pprof.StopCPUProfile()
	n := 10
	for i := 0; i < 5; i++ {
		nums := generate(n)
		bubbleSort(nums)
		n *= 10
	}
}

go run main.go > cpu.pprof

當然也可以將輸出直接導入到文件中:

2.分析數(shù)據(jù)

此時得到cpu.pprof 文件:

go tool pprof -http=:9999 cpu.pprof 如果提升Graphviz沒有安裝: apt installgraphviz (ubuntu)

訪問localhost:9999 得到:

除了在網(wǎng)頁中查看外,還可以使用交互式命令進行查看:

go tool pprof cpu.pprof

使用top 查看到 bubbleSort函數(shù)占用cpu最多。

還可以使用top --cum,按照cum(累計消耗)排序:

使用help 查看幫助:

三、內(nèi)存性能分析

下面為一段字符串拼接代碼,我們對它進行內(nèi)存分析:

package main
import (
	"math/rand"
	"github.com/pkg/profile"
)
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
func randomString(n int) string {
	b := make([]byte, n)
	for i := range b {
		b[i] = letterBytes[rand.Intn(len(letterBytes))]
	}
	return string(b)
}
func concat(n int) string {
	s := ""
	for i := 0; i < n; i++ {
		s += randomString(n)
	}
	return s
}
func main() {
	concat(100)
}

我們使用另外一個性能分析庫"github.com/pkg/profile" 它內(nèi)部封裝了 runtime/pprof 接口,使用起來更加簡單。

cpu性能分析:

defer profile.Start().Stop()

內(nèi)存性能分析:

defer profile.Start(profile.MemProfile, profile.MemProfileRate(1)).Stop()

profile包會自動在/tmp目錄下生成profile文件

go tool pprof -http=:9999 /tmp/profile575547387/mem.pprof

可以看見concat 消耗了 524 KB, 而randomString消耗了 21KB,為什么相差這么大呢?

因為go中的字符串不可修改,使用+ 連接字符串會導致重新生成新的字符串,將 + 兩邊的子字符串拷貝到新的字符串去。那這種設計多次字符串拼接的場景該如何優(yōu)化呢?使用strings.Builder

優(yōu)化后的代碼:

package main
import (
	"math/rand"
	"strings"
	"github.com/pkg/profile"
)
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
func randomString(n int) string {
	b := make([]byte, n)
	for i := range b {
		b[i] = letterBytes[rand.Intn(len(letterBytes))]
	}
	return string(b)
}
func concat(n int) string {
	sb := new(strings.Builder)
	for i := 0; i < n; i++ {
		sb.WriteString(randomString(n))
	}
	return sb.String()
}
func main() {
	defer profile.Start(profile.MemProfile, profile.MemProfileRate(1)).Stop()
	concat(100)
}

優(yōu)化后可以看到concat 函數(shù)使用了71KB 內(nèi)存,randomString函數(shù)使用了 21kb 內(nèi)存。

四、benchmark 生成 profile

使用benchmark 進行基準測試時,除了直接查看結果,還可以生成profile

testing支持cpu、mem、block

  • -cpuprofile=$FILE
  • -memprofile=$FILE, -memprofilerate=N 調整記錄速率為原來的 1/N。
  • -blockprofile=$FILE

fib_test.go

package fib
import "testing"
func fib(n int) int {
	if n == 0 || n == 1 {
		return n
	}
	return fib(n-2) + fib(n-1)
}
func BenchmarkFib(b *testing.B) {
	for n := 0; n < b.N; n++ {
		fib(30) // run fib(30) b.N times
	}
}

go test -bench=. test/bench/fib -cpuprofile=cpu.pprof

go tool pprof -test cpu.pprof

go tool pprof 支持多種輸出格式:

go tool pprof

到此這篇關于Golang pprof性能測試與分析講解的文章就介紹到這了,更多相關Go pprof性能測試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Golang語言使用像JAVA?Spring注解一樣的DI和AOP依賴注入實例

    Golang語言使用像JAVA?Spring注解一樣的DI和AOP依賴注入實例

    這篇文章主要為大家介紹了Golang語言使用像JAVA?Spring注解一樣的DI和AOP依賴注入實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 通過案例詳細聊聊Go語言的變量與常量

    通過案例詳細聊聊Go語言的變量與常量

    在任何一門現(xiàn)代的高級語言中,變量和常量都是它非?;A的程序結構的組成部分,下面這篇文章主要給大家介紹了關于如何通過案例詳細聊聊Go語言的變量與常量的相關資料,需要的朋友可以參考下
    2023-03-03
  • Go語言string,int,int64 ,float之間類型轉換方法

    Go語言string,int,int64 ,float之間類型轉換方法

    Go語言中int類型和string類型都是屬于基本數(shù)據(jù)類型,兩種類型的轉化都非常簡單。下面通過本文給大家分享Go語言string,int,int64 ,float之間類型轉換方法,感興趣的朋友一起看看吧
    2017-07-07
  • golang控制結構select機制及使用示例詳解

    golang控制結構select機制及使用示例詳解

    這篇文章主要介紹了golang控制結構select機制及使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 使用Go語言封裝實現(xiàn)郵件發(fā)送功能

    使用Go語言封裝實現(xiàn)郵件發(fā)送功能

    在現(xiàn)代 Web 開發(fā)中,郵件發(fā)送功能是一個常見的需求,本文將介紹如何在 Go 語言中封裝一個通用的郵件發(fā)送包,支持驗證碼發(fā)送和通用郵件發(fā)送,需要的可以參考下
    2025-03-03
  • golang編程入門之http請求天氣實例

    golang編程入門之http請求天氣實例

    這篇文章主要介紹了golang編程入門之http請求天氣實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • golang json.Marshal 特殊html字符被轉義的解決方法

    golang json.Marshal 特殊html字符被轉義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉義的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Go各時間字符串使用解析

    Go各時間字符串使用解析

    這篇文章主要介紹了Go各時間字符串使用解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • go交叉編譯sqlite報錯問題解決分析

    go交叉編譯sqlite報錯問題解決分析

    這篇文章主要為大家介紹了go交叉編譯sqlite報錯問題解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • go?singleflight緩存雪崩源碼分析與應用

    go?singleflight緩存雪崩源碼分析與應用

    這篇文章主要為大家介紹了go?singleflight緩存雪崩源碼分析與應用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09

最新評論

四子王旗| 平遥县| 措勤县| 大田县| 永兴县| 桂平市| 西林县| 云梦县| 安徽省| 锡林郭勒盟| 克什克腾旗| 新兴县| 黄冈市| 临汾市| 卓尼县| 邵阳县| 宿州市| 达拉特旗| 启东市| 清徐县| 广东省| 象山县| 陵水| 临沧市| 德令哈市| 定安县| 涿鹿县| 仁寿县| 呼和浩特市| 行唐县| 衡阳县| 柳河县| 墨竹工卡县| 海盐县| 仁寿县| 奈曼旗| 偃师市| 子长县| 周口市| 车致| 玉溪市|