正文
一、原代码
package main import ( "log" "net/http" _ "net/http/pprof" "time" ) var datas []string func main() { go func() { for { log.Printf("len: %d", Add("qijing")) time.Sleep(time.Millisecond * 10) } }() _ = http.ListenAndServe("0.0.0.0:2022", nil) } func Add(str string) int { data := []byte(str) datas = append(datas, string(data)) return len(datas) }
二、CPU 占用分析
项目更目录下执行 go tool pprof http://127.0.0.1:2022/debug/pprof/profile?seconds=30
,结束之后会默认进入 PProf 的命令行交互模式,接着输入 top 10
,如下图,
- flat: 函数自身的运行耗时。
- flat%: 函数自身占 CPU 运行总耗时的比例。
- sum%: 函数自身累积使用占 CPU 运行总耗时的比例。
- cum: 函数自身及其调用的函数的运行总耗时。
- cum%: 函数自身及其调用的函数占 CPU 运行总耗时的比例
- Name: 函数名。
三、内存占用分析
项目根目录下执行 go tool pprof http://127.0.0.1:2022/debug/pprof/heap
,结束之后会默认进入 PProf 的命令行交互模式,接着输入 top
,如图所示,
- flat: 函数自身占内存大小。
- flat%: 函数自身占总分配内存的比例。
- sum%: 函数自身累积占用内存占总内存的比例。
- cum: 函数自身及其调用的函数占内存大小
- cum%: 函数自身及其调用的函数占总内存的比例。
- Name: 函数名。
上面可以看到,main.main.fun1
的 cum
大小正好等于自身的 flat
大小加上 main.Add
大小的 flat
大小