Go 自带 pprof 和 testing.B 是轻量高效性能分析工具;pprof 通过 HTTP 接口采集 CPU、内存等运行时数据,testing.B 支持基准测试与并发压测,配合火焰图和对比分析可精准定位性能瓶颈与内存泄漏。

Go 自带的 pprof 和 testing.B(benchmark)是轻量、高效、无需第三方依赖的性能分析利器。它们不需额外安装工具,只要 Go 环境就绪,就能直接使用。
启用 pprof 服务进行运行时分析
pprof 支持 HTTP 接口采集 CPU、内存、goroutine、block、mutex 等数据。只需在程序中导入 net/http/pprof,它会自动注册路由:
- 启动一个 HTTP 服务(哪怕只是本地监听),例如:
go run main.go & - 在代码开头加入:
import _ "net/http/pprof" - 确保有 HTTP 服务(哪怕只监听
:6060):
go func() { http.ListenAndServe(":6060", nil) }() - 用命令行采集数据,例如:
go tool pprof http://localhost:6060/debug/pprof/profile(默认 30 秒 CPU 采样)
go tool pprof http://localhost:6060/debug/pprof/heap(当前内存快照)
用 go test -bench 进行基准测试
Go 的 testing 包原生支持 benchmark,写法简洁,结果可比性强:
- 新建
xxx_test.go文件,函数名以Benchmark开头,参数为*testing.B - 在
B.ResetTimer()前完成初始化(如构建数据),避免计入耗时 - 用
B.RunParallel测试并发场景,或B.N控制循环次数 - 运行命令:
go test -bench=^BenchmarkMyFunc$ -benchmem -count=3
其中-benchmem显示内存分配统计,-count多次运行取平均
可视化分析 pprof 数据
采集到的 profile 文件(如 cpu.pprof)可用交互式命令行或 Web 界面深入分析:
立即学习“go语言免费学习笔记(深入)”;
- 生成火焰图(需 Graphviz):
go tool pprof -http=:8080 cpu.pprof → 自动打开浏览器 - 常用交互命令(进入 pprof CLI 后):
top10 查看耗时最多的 10 个函数
list FuncName 查看该函数源码及每行耗时
web 生成 SVG 火焰图(需安装 dot 工具) - 内存分析重点关注:
inuse_space(当前占用)、alloc_space(总分配量),区分“用了多少”和“申请了多少”
小技巧:快速定位高频调用与内存泄漏
实际排查中,几个组合操作很实用:
- 对比两次 heap profile:
先curl 'http://localhost:6060/debug/pprof/heap?debug=1'记下 allocs/inuse;
执行可疑操作后再次采集,用go tool pprof -base base.heap new.heap对比差异 - 用
runtime.GC()强制触发 GC 后再采 heap,排除未回收对象干扰 - 对慢函数加
defer trace.StartRegion(ctx, "FuncName").End()(需golang.org/x/exp/trace),配合go tool trace查看 Goroutine 执行流











