深入Go语言:高效基准测试与性能分析指南

发布时间:2024年01月11日

基准测试

1. 编写 测试代码

基准测试在 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
		}
		// 比较结果通常在基准测试中不进行,因为我们关注的是性能而非正确性
	}
}

2. 运行测试

可以使用 go test 命令并结合 -run 标志,后面跟上你想要运行的测试函数的名称模式。
如果你想要获取关于内存分配的详细信息,可以在运行基准测试时使用 -benchmem 标志:

go test -run=^$ -bench={your testing name} -benchmem

性能分析

  1. 使用 pprof 进行性能分析:

    • 首先,你需要在基准测试时启用性能分析。可以通过在 go test 命令中加入 -cpuprofile-memprofile 标志来收集 CPU 和内存使用情况的数据。

    • 例如,运行以下命令:
      go test -bench=BenchmarkMyFunction -cpuprofile cpu.out -memprofile mem.out

    • 这将生成 CPU 和内存的性能分析文件(分别是 cpu.outmem.out)。

  2. 分析性能数据:

    • 使用 go tool pprof 命令来分析这些性能数据文件。
    • 例如,要分析 CPU 性能数据,可以使用:
      go tool pprof cpu.out
    • pprof 的交互式命令行界面中,你可以使用各种命令来查看不同的数据视图,例如 top 查看最耗时的函数
      image.png
    • pprof 的命令行界面中,使用 web 命令可以生成调用链路图。这需要你的系统中安装了图形化工具(如 Graphviz)。执行 web 命令后,pprof 会自动打开一个包含调用链路图的浏览器窗口。
      image.png
  3. 分析内存使用情况:

    • 类似地,你也可以使用 go tool pprof mem.out 来分析内存使用情况。

指标含义

pprof 工具中,当你查看性能分析结果时,会看到一系列的列,其中包括 flat, flat%, sum%, cum, 和 cum%。这些指标提供了不同的性能数据视角:

  1. flat: 这个值表示在该特定函数上直接花费的时间或资源总量(例如 CPU 时间或内存分配)。它不包括该函数调用的其他函数所花费的时间或资源。

  2. flat%: 这是 flat 值占分析总量的百分比。例如,在 CPU 分析中,如果 flat% 是 20%,这意味着这个函数直接消耗了总 CPU 时间的 20%。

  3. sum%: 这个百分比是累积的。它显示了到当前行为止,所有函数的 flat% 的总和。这有助于你快速了解最耗时的函数。

  4. cum(累积): 这个值表示该函数以及它调用的所有函数在一起消耗的时间或资源总量。举例来说,如果一个函数调用了多个其他函数,cum 将包括这个函数本身的时间加上所有这些调用的时间。

  5. 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 中用于生成图形的一个重要工具。

你可以按照以下步骤操作:

  1. 安装 Graphviz:
    • 如果你还没有安装 Graphviz,需要先安装它。Graphviz 可以在多种操作系统上安装,包括 Windows、macOS 和 Linux。
    • 在 macOS 上,你可以使用 Homebrew 来安装:brew install graphviz
    • 在 Linux 上,你可以使用包管理器来安装,例如在 Ubuntu 或 Debian 上:sudo apt-get install graphviz
    • 在 Windows 上,你可以从 Graphviz 的官方网站 下载安装程序。
  2. 确保 Graphviz 的 dot 工具在你的 PATH 环境变量中:
    • 安装 Graphviz 后,确保 dot 可执行文件的路径被添加到你的系统 PATH 环境变量中。这样,pprof 工具就可以找到并使用它来生成图形。
    • 在 UNIX 系统(包括 Linux 和 macOS)上,你可以通过运行 echo $PATH 来检查 PATH 环境变量,并用 which dot 来验证 dot 命令是否被正确安装。
    • 在 Windows 上,你可能需要手动设置环境变量,以包含 Graphviz 的安装目录。
  3. 重新运行 pprofweb 命令:
    • 一旦 Graphviz 安装并配置正确,你应该能够重新运行 pprofweb 命令,并成功生成调用链路图。
文章来源:https://blog.csdn.net/w_monster/article/details/135538109
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。