Go: pprof与性能分析

本文介绍了如何使用Go的pprof工具进行性能分析,包括CPU和内存性能的监测。对于非服务程序,展示了源代码及分析流程;对于服务型程序,讲解了如何在main文件中集成,并通过`top`命令观察资源占用情况。配合图形分析,pprof成为Go性能调优的强大助手。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pprof是非常好用的性能分析工具


非 服 务 类 程 序 \red{非服务类程序}

源代码:

package main

import (
	"fmt"
	"time"
)

func dfs(ans *[][]int,path []int,sum int,k int){
	if sum > k {
		return
	}
	if sum == k {
		*ans = append(*ans, path)
		return
	}
	for i:=1;i<10;i++{
		t := i
		path = append(path, t)
		sum += t
		dfs(ans, path, sum, k)
		sum -= t
		path = path[:len(path)-1:len(path)-1]
	}
}

func solve(k int) [][]int{
	ans := make([][]int,0) 			
	path := make([]int,0) 			
	dfs(&ans,path,0,k)
	return ans
}

func main(){
	start := time.Now()
	fmt.Println(len(solve(24)))
	fmt.Println(time.Since(start))
}

c p u 性 能 分 析 : \red{cpu性能分析:} cpu

package main

import (
	"flag"
	"fmt"
	"log"
	"os"
	"runtime/pprof"
	"time"
)

var cpuProfile = flag.String("cpuprofile","","write cpu profile to file")

func dfs(ans *[][]int,path []int,sum int,k int){
	if sum > k {
		return
	}
	if sum == k {
		*ans = append(*ans, path)
		return
	}
	for i:=1;i<10;i++{
		t := i
		path = append(path, t)
		sum += t
		dfs(ans, path, sum, k)
		sum -= t
		path = path[:len(path)-1:len(path)-1]
	}
}

func solve(k int) [][]int{
	ans := make([][]int,0)
	path := make([]int,0)
	dfs(&ans,path,0,k)
	return ans
}

func main(){
	flag.Parse()
	if *cpuProfile != "" {
		f, err := os.Create(*cpuProfile)
		if err != nil {
			log.Fatal(err)
		}
		_ = pprof.StartCPUProfile(f)
		defer pprof.StopCPUProfile()
	}
	start := time.Now()
	fmt.Println(len(solve(24)))
	fmt.Println(time.Since(start))
}

程序运行完毕后:

go tool pprof algorithm cpuProfile.prof
top10 		# 前10个
top5 -cum 	# 按cum排序
web 		# 输出图文件
web growslice # 查看特定函数的图文件

m e m 性 能 分 析 : \red{mem性能分析:} mem

package main

import (
	"flag"
	"fmt"
	"log"
	"os"
	"runtime/pprof"
	"time"
)

var cpuProfile = flag.String("cpuprofile","","write cpu profile to file")
var memprofile = flag.String("memprofile","","write memory profile to this file")

func dfs(ans *[][]int,path []int,sum int,k int){
	if sum > k {
		return
	}
	if sum == k {
		*ans = append(*ans, path)
		return
	}
	for i:=1;i<10;i++{
		t := i
		path = append(path, t)
		sum += t
		dfs(ans, path, sum, k)
		sum -= t
		path = path[:len(path)-1:len(path)-1]
	}
}

func solve(k int) [][]int{
	ans := make([][]int,0)
	path := make([]int,0)
	dfs(&ans,path,0,k)
	return ans
}

func main(){
	flag.Parse()
	if *cpuProfile != "" {
		f, err := os.Create(*cpuProfile)
		if err != nil {
			log.Fatal(err)
		}
		_ = pprof.StartCPUProfile(f)
		defer pprof.StopCPUProfile()
	}
	start := time.Now()
	fmt.Println(len(solve(24)))
	fmt.Println(time.Since(start))
	if *memprofile != "" {
		f, err := os.Create(*memprofile)
		if err != nil {
			log.Fatal(err)
		}
		_ = pprof.WriteHeapProfile(f)
		defer pprof.StopCPUProfile()
	}
}

程序运行完毕后:

go tool pprof algorithm memProfile.mprof
top5			# 列出top5
list main.dfs 	# 列出函数dfs

对 于 服 务 类 型 , 需 要 在 m a i n 文 件 中 加 入 : \red{对于服务类型,需要在main文件中加入:} main

import _ "net/http/pprof"

func main(){
	go func(){
		http.ListenAndServe("0.0.0.0:8899",nil)
	}()
}

在服务运行后,来分析数据:

go tool pprof -inuse_space http://your_ip:8899/debug/pprof/heap

进入命令交互洁面,top查看占用比:

top

图片分析更直观:

go tool pprof -inuse_space -cum -svg http://your_ip:8899/debug/pprof/heap > heap_inuse.svg

参考:
Profiling Go Programs + 优秀中文翻译
【实践】使用Go pprof做内存性能分析
Go pprof性能调优
Golang 大杀器之性能剖析 PProf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值