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

基准测试

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 命令,并成功生成调用链路图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/340713.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何进行大数据系统测试

大数据系统常见的架构形式有如下几种&#xff1a; Hadoop架构&#xff1a; Hadoop Distributed File System (HDFS)&#xff1a;这是一种分布式文件系统&#xff0c;设计用于存储海量数据并允许跨多台机器进行高效访问。 MapReduce&#xff1a;作为Hadoop的核心计算框架&#…

如何在Github上快速下载代码

由于网络环境问题&#xff0c;有时候比较难从Github上下载代码&#xff0c;我归纳了以下三种从Github上下载代码的方法&#xff0c;如何选择使用&#xff0c;可根据你的实际情况&#xff1a; 目录 方法一&#xff1a;使用 “Download ZIP” 按钮 方法二&#xff1a;使用 Git…

【浅尝C++】引用

&#x1f388;归属专栏&#xff1a;浅尝C &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;记录一句&#xff1a;大半夜写博客的感觉就是不一样&#xff01;&#xff01; 文章前言&#xff1a;本篇文章简要介绍C中的引用&#xff0c;每个介绍的技术点&#xff0c;在…

上架苹果APP的时候在哪里填写APP的隐私政策信息

在如今高度重视数据隐私的时代&#xff0c;开发并上架一个iOS APP时提供透明的隐私政策是非常重要的。苹果公司对此有严格的规定&#xff0c;任何上架至App Store的应用都必须包含一个隐私政策。以下是您在上架苹果APP时填写隐私政策信息的详细步骤和必须注意的事项。 准备隐私…

Centos7升级openssl到openssl1.1.1

Centos7升级openssl到openssl1.1.1 1、先查看openssl版本&#xff1a;openssl version 2、Centos7升级openssl到openssl1.1.1 升级步骤 #1、更新所有现有的软件包列表并安装最新的软件包&#xff1a; $sudo yum update #2、接下来&#xff0c;我们需要从源代码编译和构建OpenS…

平时执行很快的SQL语句,为什么会突然卡一下?

InnoDB在处理更新语句的时候&#xff0c;只做了写日志这一个磁盘操作&#xff0c;这个日志叫作redo log&#xff08;重做日志&#xff09;&#xff0c;在更新内存写完redo log后&#xff0c;就返回给客户端&#xff0c;本次更新成功。 把内存里的数据写入磁盘的过程&#xff0…

Electron中调用dll

截止目前Electron的官方稳定版本已经更新到了28.1.1。我在创建Electron项目时用的28.0.0版本&#xff0c;后面在项目中有用到调用dll方法的需求&#xff0c;大致的实现就是将后端给的dll文件引入到项目中&#xff0c;安装ffi-napi依赖&#xff0c;然后进行使用。但是在Electron…

ROS---激光雷达的使用

ROS—激光雷达的使用 激光雷达是现今机器人尤其是无人车领域及最重要、最关键也是最常见的传感器之一&#xff0c;是机器人感知外界的一种重要手段。本文将介绍在ROS下使用激光雷达传感器&#xff0c;我们选用的激光雷达型号为思岚A1。 使用流程如下: 硬件准备&#xff1b;软…

什么是集成测试?

什么是集成测试 集成测试&#xff08;Integration Testing&#xff09;&#xff0c;也叫组装测试或联合测试。在单元测试的基础上&#xff0c;将所有模块按照设计要求&#xff08;如根据结构图&#xff09;组装成为子系统或系统&#xff0c;进行集成测试。 集成测试&#xff…

Java并发之互斥一:管程

1、简单聊聊什么是管程模型 &#xff08;共享资源&#xff09;&#xff1a;定义一个共享变量&#xff0c;可以理解锁&#xff0c;令牌这类的东西&#xff08;互斥访问共享资源&#xff09;&#xff1a;获取这个锁、令牌的时候是排好队的&#xff0c;只允许单线程访问&#xff…

大模型实战笔记04——XTuner 大模型单卡低成本微调实战

大模型实战笔记04——XTuner 大模型单卡低成本微调实战 1、Finetune简介 2、XTuner 3、8GB显存玩转LLM 4、动手实战环节 注&#xff1a; 笔记内容均为截图 课程视频地址&#xff1a;https://www.bilibili.com/video/BV1yK4y1B75J/?spm_id_from333.788&vd_source2882acf…

力扣LCR 166. 珠宝的最高价值(java 动态规划)

Problem: LCR 166. 珠宝的最高价值 文章目录 解题思路思路解题方法复杂度Code 解题思路 思路 改题目与本站64题实质上是一样的&#xff0c;该题目在64题的基础上将求取最小路径和改成了求取最大路径和。具体实现思路如下&#xff1a; 1.定义一个int类型的二维数组dp大小为给定…