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

news2024/10/1 5:40:01

基准测试

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.coloradmin.cn/o/1378516.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

腾讯实验平台基于 StarRocks 构建湖仓底座

作者&#xff1a; 腾讯大数据平台部科学实验中心Tech Lead、专家工程师 马金勇博士 腾讯大数据平台部科学实验中心数据负责人、专家工程师 胡明杰 StarRocks Contributor、腾讯高级工程师 刘志行 在 2022 年&#xff0c;腾讯 A/B Test 团队启动了海外商业化版本 ABetterChoice …

代码随想录算法训练营第三天| LeetCode203.移除链表元素、707.设计链表、206.反转链表

文章目录 一、203. 移除链表元素感受代码 二、707.设计链表感受代码 206.反转链表感受 总结 一、203. 移除链表元素 感受 我对这道题。从理论上来说太熟悉了。咸鱼讲数据结构常用的方法他都会讲。但是我没上机没写过。到后面上机还是写不出来。giao。 代码 第一次写&#xf…

css 背景是个图片并且含有透明度的渐变色.超级简单。background相关属性就行了

底纹是个背景图片。 然后上面有个渐变色。渐变色含有透明度这样才能把底纹显示出来 不用麻烦的把图片放进去各种定位修改层级来写啦。 直接一个background相关属性就行了。 背景色怎么增加透明度呢 使用rgba的方式rgba(127,47,255,0.7)。 //0.7是透明度 background-image:li…

文心一言 VS 讯飞星火 VS chatgpt (177)-- 算法导论13.3 6题

六、用go语言&#xff0c;说明如果红黑树的表示中不提供父指针&#xff0c;应当如何有效地实现 RB-INSERT。 文心一言&#xff1a; 红黑树是一种自平衡的二叉搜索树&#xff0c;其中每个节点都包含一个颜色属性&#xff08;红色或黑色&#xff09;&#xff0c;并且满足以下性…

宝塔数据库一直提示密码错误

宝塔一直提示密码错误&#xff0c;直接在界面上操作修改root 密码也无效的修改办法&#xff1b; 则修改办法是&#xff0c;需要到 linux终端自己修改 mysql root的密码 忘记root密码&#xff0c;修改密码&#xff08;针对5.7版本&#xff09; 其中 skip-grant-tables 加到 …

MySQL 8查询语句之查询所有字段、特定字段、去除重复字段、Where判断条件

《MySQL 8创建数据库、数据表、插入数据并且查询数据》里边有我使用到的数据。 再使用下方的语句补充一些数据&#xff1a; insert into Bookbought.bookuser(id,username,userphone,userage,sex,userpassword) values (11,Book Break,22245678911,18,male,good#111); insert…

基于kkFileView实现万能文件预览

基于kkFileView实现万能文件预览 1.简介 文档在线预览项目解决方案&#xff0c;项目使用流行的spring boot搭建&#xff0c;易上手和部署。万能的文件预览开源项目&#xff0c;基本支持主流文档格式预览 官网&#xff1a;https://kkview.cn/zh-cn/docs/home.html github地址…

图像分割deeplab系列

DeepLab系列是谷歌团队提出的一系列语义分割算法。DeepLab v1于2014年推出&#xff0c;并在PASCAL VOC2012数据集上取得了分割任务第二名的成绩&#xff0c;随后2017到2018年又相继推出了DeepLab v2&#xff0c;DeepLab v3以及DeepLab v3。DeepLab v1的两个创新点是空洞卷积&am…

西门子S7-1200直接连接MySQL数据库

最近项目上有个需求&#xff0c;要把采集的数据存储到数据库中&#xff0c;当前西门子有很多方法&#xff0c;必读IDB&#xff0c;还有通过WINCC的脚本&#xff0c;第三方的软件等等&#xff0c;但是随着发展&#xff0c;有些需求希望设备直接到数据库&#xff0c;比如云端的RD…

3D人体姿态估计

3D人体姿态估计是指通过算法对输入的图像或视频进行分析&#xff0c;推断出人体的三维姿态信息。该技术可以应用于许多领域&#xff0c;如虚拟现实、运动分析、人机交互等。 1. 算法原理&#xff1a; 3D人体姿态估计利用深度学习模型作为算法的核心&#xff0c;通过网络学习人…

redis缓存雪崩、穿透和击穿

缓存雪崩 对于系统 A&#xff0c;假设每天高峰期每秒 5000 个请求&#xff0c;本来缓存在高峰期可以扛住每秒 4000 个请求&#xff0c;但是缓存机器意外发生了全盘宕机或者大量缓存集中在某一个时间段失效。缓存挂了&#xff0c;此时 1 秒 5000 个请求全部落数据库&#xff0c;…

Java常用类---日期时间类

日期时间类 Date类 简介 在Java中&#xff0c;Date类用来封装当前的日期和时间。Date类提供两个构造函数来初始化对象&#xff0c;如下所示。 通过Date() 使用当前日期和时间来初始化对象。 通过Date(long millisec) 来初始化对象&#xff0c;其中的参数是从1970年1月1日起…

【数字电子技术课程设计】多功能数字电子钟的设计

目录 摘要 1 设计任务要求 2 设计方案及论证 2.1 任务分析 2.1.1 晶体振荡器电路 2.1.2 分频器电路 2.1.3 时间计数器电路 2.1.4 译码驱动电路 2.1.5 校时电路 2.1.6 整点报时/闹钟电路 2.2 方案比较 2.3 系统结构设计 2.4 具体电路设计 3 电路仿真测试及结…

必须掌握的100+个Linux命令大全【持续更新中】

别有一番风趣的alias … note:: 寒蝉凄切&#xff0c;对长亭晚&#xff0c;骤雨初歇。 柳永《雨霖铃》 Linux alias命令用于设置指令的别名&#xff0c;可以将比较长的命令进行简化。 默认情况下会输出当前的设置&#xff1a; $ alias lls -lah lals -lAh llls -lh lsls --…

【ELK 学习】ElasticSearch

ELK&#xff1a;ElasticSearch存储&#xff0c;Logstash收集&#xff0c;Kibana展示 版本较多&#xff0c;使用时需要版本匹配&#xff0c;还需要和mysql版本匹配&#xff08;elastic官网给了版本对应关系&#xff09; 本次使用的版本es6.8.12 filebeat 轻量级的数据收集工具 …

时间序列数据库选型: influxdb; netdiscover列出docker实例们的ip

influxdb influxdb: 有收费版本、有开源版本 influxdb 安装、启动(docker) docker run -itd --name influxdb-dev -p 8086:8086 influxdb #influxdb的web客户端(端口8003)被去掉了 #8006是web-service端口#docker exec -it influxdb-dev bashinfluxdb 自带web界面 从后面的…

揭秘HTTP协议:深入了解互联网通信的核心!

文章目录 HTTPHTTP的消息结构HTTP 常用请求方法HTTP 状态码 HTTP HTTP 是超文本传输协议&#xff0c;HTTP是缩写&#xff0c;全称是 HyperText Transfer Protocol 超文本指的是 HTML、css、JavaScript和图片等&#xff0c;HTTP的出现就是为方便接收和发布超HTML页面&#xff0c…

基于Echarts的大数据可视化模板:厅店营业效能分析

目录 引言厅店营业效能分析的重要性大数据时代下的零售业基于Echarts的厅店营业效能分析案例分析目标和数据准备图表类型的选择和参数设置图表样式和交互功能的优化Echarts与大数据可视化Echarts库以及其在大数据可视化领域的应用优势开发过程和所选设计方案模板如何满足管理的…

私域2.0大变革:构建用户亲密关系,让你的品牌脱颖而出!

一、私域2.0发展趋势 1. 常态化&#xff1a;2024年&#xff0c;做私域已经成为“标配” 根据腾讯营销洞察&#xff08;TMI&#xff09;的研究&#xff0c;微信生态和自营APP等私域触点在中国市场的渗透率已经达到了惊人的96%。这意味着&#xff0c;超过四分之三的消费者在过去…

AES加解密模式

要想学习AES&#xff0c;首先要清楚三个基本的概念&#xff1a;密钥、填充、模式。 1、密钥 密钥是AES算法实现加密和解密的根本。对称加密算法之所以对称&#xff0c;是因为这类算法对明文的加密和解密需要使用同一个密钥。 AES支持三种长度的密钥&#xff1a; 128位&#xff…