基准测试在 Go 中通常是以 Benchmark
开头的函数,接受一个 *testing.B
类型的参数。这个参数提供了控制基准测试运行的方法,比如指定测试运行的次数。
func BenchmarkServer_XX(b *testing.B) {
// 准备测试的 Server 实例和其他需要的数据
s := &Server{
// ... fields ...
}
// 基准测试主循环
for i := 0; i < b.N; i++ {
// 这里执行你想要测试的函数
_, err := s.XX(/* ctx, request 等参数 */)
if err != nil {
b.Errorf("XX() error = %v", err)
return
}
// 比较结果通常在基准测试中不进行,因为我们关注的是性能而非正确性
}
}
可以使用 go test
命令并结合 -run
标志,后面跟上你想要运行的测试函数的名称模式。
如果你想要获取关于内存分配的详细信息,可以在运行基准测试时使用 -benchmem
标志:
go test -run=^$ -bench={your testing name} -benchmem
使用 pprof
进行性能分析:
首先,你需要在基准测试时启用性能分析。可以通过在 go test
命令中加入 -cpuprofile
和 -memprofile
标志来收集 CPU 和内存使用情况的数据。
例如,运行以下命令:
go test -bench=BenchmarkMyFunction -cpuprofile cpu.out -memprofile mem.out
这将生成 CPU 和内存的性能分析文件(分别是 cpu.out
和 mem.out
)。
分析性能数据:
go tool pprof
命令来分析这些性能数据文件。go tool pprof cpu.out
pprof
的交互式命令行界面中,你可以使用各种命令来查看不同的数据视图,例如 top
查看最耗时的函数pprof
的命令行界面中,使用 web
命令可以生成调用链路图。这需要你的系统中安装了图形化工具(如 Graphviz)。执行 web
命令后,pprof
会自动打开一个包含调用链路图的浏览器窗口。分析内存使用情况:
go tool pprof mem.out
来分析内存使用情况。在 pprof
工具中,当你查看性能分析结果时,会看到一系列的列,其中包括 flat
, flat%
, sum%
, cum
, 和 cum%
。这些指标提供了不同的性能数据视角:
flat: 这个值表示在该特定函数上直接花费的时间或资源总量(例如 CPU 时间或内存分配)。它不包括该函数调用的其他函数所花费的时间或资源。
flat%: 这是 flat
值占分析总量的百分比。例如,在 CPU 分析中,如果 flat%
是 20%,这意味着这个函数直接消耗了总 CPU 时间的 20%。
sum%: 这个百分比是累积的。它显示了到当前行为止,所有函数的 flat%
的总和。这有助于你快速了解最耗时的函数。
cum(累积): 这个值表示该函数以及它调用的所有函数在一起消耗的时间或资源总量。举例来说,如果一个函数调用了多个其他函数,cum
将包括这个函数本身的时间加上所有这些调用的时间。
cum%: 这是 cum
值占分析总量的百分比。它表示该函数及其递归调用所占的资源使用(如 CPU 时间或内存分配)的百分比。
了解这些指标对于识别和优化代码中的性能瓶颈至关重要。例如,一个高 flat%
值表明该函数本身可能是性能瓶颈,而高 cum%
值则表明该函数及其调用的函数整体上是瓶颈。
错误消息 “failed to execute dot. Is Graphviz installed? Error: exec: ‘dot’: executable file not found in $PATH” 表明你的系统中没有安装 Graphviz,或者 Graphviz 的 dot
工具没有正确地添加到系统的 PATH 环境变量中。dot
是 Graphviz 中用于生成图形的一个重要工具。
你可以按照以下步骤操作:
brew install graphviz
。sudo apt-get install graphviz
。dot
工具在你的 PATH 环境变量中:
dot
可执行文件的路径被添加到你的系统 PATH 环境变量中。这样,pprof
工具就可以找到并使用它来生成图形。echo $PATH
来检查 PATH 环境变量,并用 which dot
来验证 dot
命令是否被正确安装。pprof
的 web
命令:
pprof
的 web
命令,并成功生成调用链路图。