当前位置: 首页 > news >正文

Go怎么做性能优化工具篇之基准测试

一、什么是基准测试(Benchmark)

在 Go 中,基准测试是通过创建以 Benchmark 开头的函数,并接收一个 *testing.B 类型的参数来实现的。testing.B 提供了控制基准测试执行的接口,比如设置测试执行的次数、记录每次执行的时间等。

每个基准测试函数都必须接受一个 *testing.B 类型的参数。函数体内通过 b.N来控制基准测试的执行次数,Go 会自动调整 b.N 的值,确保每次基准测试运行的时间足够长。

例如:

package mainimport ("testing"
)// 基准测试函数
func BenchmarkMyFunction(b *testing.B) {// 这里是测试的代码,每次循环 b.N 次for i := 0; i < b.N; i++ {// 被测试的函数或代码块_ = "hello"}
}

二、怎么进行基准测试

要运行基准测试,可以使用 go test 命令,指定 -bench 标志来启动基准测试。

go test -bench .
  • bench .:表示运行当前目录下所有以 Benchmark 开头的函数。
  • bench <pattern> :可以通过提供正则表达式来运行特定的基准测试,比如 go test -bench BenchmarkMyFunction 仅运行 BenchmarkMyFunction。

运行基准测试并报告内存分配

go test -bench . -benchmem
  • benchmem:该标志会显示内存分配的详细信息,包括每次基准测试中分配了多少内存。
package mainimport ("testing""unsafe"
)func BenchmarkBytes2Str(b *testing.B) {aa := []byte("mclink")for n := 0; n < b.N; n++ {Bytes2Str(aa)}
}
func BenchmarkBytes2StrUnsafe(b *testing.B) {aa := []byte("mclink")for n := 0; n < b.N; n++ {Bytes2StrUnsafe(aa)}
}func Bytes2Str(b []byte) string {return string(b)
}func Bytes2StrUnsafe(b []byte) string {return *(*string)(unsafe.Pointer(&b))
}

在这里插入图片描述
#从左到右分别表示benchmark函数、运行次数、单次运行消耗的时间、单次运行内存分配的字节数和次数

BenchmarkBytes2Str-8 :基准测试的名称和 CPU 核心数量(这里 -8 表示在 8 核 CPU 上运行)。
317858601:测试函数执行了 20,000,000 次。
3.720 ns/op:每次执行 BenchmarkBytes2Str-8 的平均耗时为 3.72 纳秒。
0 B/op:每次测试没有内存分配。
0 allocs/op:每次测试没有进行内存分配。

三、复杂的基准测试

有时在基准测试中,某些初始化工作并不应该计入测试时间。可以使用 b.StartTimer() 和 b.StopTimer() 来控制计时开始和结束。

func BenchmarkWithStartStopTimer(b *testing.B) {// 1. 先进行一些初始化工作setup()// 2. 在基准测试前停止计时(这部分不会计入基准测试时间)b.StopTimer()// 3. 进行某些准备工作或其他代码,这部分不会计入基准测试时间time.Sleep(100 * time.Millisecond)// 4. 启动计时,开始计入基准测试时间b.StartTimer()// 5. 开始基准测试for i := 0; i < b.N; i++ {performWork()}// 6. 结束时停止计时b.StopTimer()
}
  • b.StartTimer():开始计时。
  • b.StopTimer():停止计时。
  • b.ResetTimer():重置计时器,确保计时仅限于你关心的代码

你可以使用 b.ReportAllocs() 启用内存报告,来查看每次基准测试中分配了多少内存。

func BenchmarkAllocations(b *testing.B) {b.ReportAllocs() // 启用内存分配报告for i := 0; i < b.N; i++ {_ = make([]byte, 1024) // 模拟内存分配}
}

在这里插入图片描述

  • 通过 -benchtime 设置基准测试时间
    go test 命令支持 -benchtime 标志,可以控制基准测试的执行时长。例如,如果你想要让基准测试执行 2 秒钟:
go test -bench . -benchtime=2s
  • 跳过普通单元测试,只运行基准测试
    如果你只想运行基准测试,而跳过普通的单元测试,可以使用 -run=^$ 来过滤单元测试:
go test -bench . -run=^$
  • 和pprof 混合双打
package mainimport ("fmt""testing""time""runtime/pprof""os"
)// 需要进行基准测试的函数
func performTask() {// 模拟耗时操作time.Sleep(100 * time.Millisecond)
}// 基准测试函数
func BenchmarkWithPprof(b *testing.B) {// 创建一个文件来保存 CPU 分析数据f, err := os.Create("cpu.pprof")if err != nil {b.Fatal("could not create CPU profile: ", err)}defer f.Close()// 启动 pprof,开始记录 CPU 使用情况if err := pprof.StartCPUProfile(f); err != nil {b.Fatal("could not start CPU profile: ", err)}defer pprof.StopCPUProfile()// 进行基准测试for i := 0; i < b.N; i++ {performTask()}
}// 运行基准测试的命令:go test -bench .
// 运行完之后会生成一个 cpu.pprof 文件,可以用 go tool pprof 查看分析数据。

如何使用 pprof 请看上一篇文章。

下一篇:Go的 Trace 工具~

相关文章:

Go怎么做性能优化工具篇之基准测试

一、什么是基准测试&#xff08;Benchmark&#xff09; 在 Go 中&#xff0c;基准测试是通过创建以 Benchmark 开头的函数&#xff0c;并接收一个 *testing.B 类型的参数来实现的。testing.B 提供了控制基准测试执行的接口&#xff0c;比如设置测试执行的次数、记录每次执行的…...

社区管理系统:实现社区信息数字化管理的实践

3.1可行性分析 开发者在进行开发系统之前&#xff0c;都需要进行可行性分析&#xff0c;保证该系统能够被成功开发出来。 3.1.1技术可行性 开发该社区管理系统所采用的技术是vue和MYSQL数据库。计算机专业的学生在学校期间已经比较系统的学习了很多编程方面的知识&#xff0c;同…...

Java设计模式 —— 【结构型模式】外观模式详解

文章目录 概述结构案例实现优缺点 概述 外观模式又名门面模式&#xff0c;是一种通过为多个复杂的子系统提供一个一致的接口&#xff0c;而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口&#xff0c;外部应用程序不用关心内部子系统的具体的细节&#xff0c;这…...

基于 Python 的二手电子设备交易平台

标题:基于 Python 的二手电子设备交易平台 内容:1.摘要 基于 Python 的二手电子设备交易平台的摘要&#xff1a;本文介绍了一个基于 Python 的二手电子设备交易平台。该平台旨在为用户提供一个便捷、安全的交易环境&#xff0c;促进二手电子设备的流通和再利用。文章首先介绍了…...

Vue.js组件开发-插槽(Slots)的使用

插槽&#xff08;Slots&#xff09;是 Vue.js 中一个非常强大的特性&#xff0c;允许在组件内部指定可重用的内容片段&#xff0c;这些内容片段可以由父组件动态地填充。它能够让父组件决定组件内部应该渲染什么内容。 默认插槽 默认插槽是最简单的插槽类型。在子组件的模板中…...

python:面向对象简单示例

编写 se2ball.py 如下 # -*- coding: utf-8 -*- """ python 面向对象简单示例 """ import randomclass Random_ball(object):""" 随机选双色球 """def __init__(self, reds33, blues16):""" 初始…...

Stealthy Attack on Large Language Model based Recommendation

传统RS依赖id信息进行推荐&#xff0c;攻击&#xff1a;生成虚假用户&#xff0c;这些用户对特定目标物体给于高评价&#xff0c;从而影响模型的训练。 基于llm的RS&#xff1a;llm利用语义理解&#xff0c;将用户兴趣转化为语义向量&#xff0c;通过计算用户兴趣向量与物品向…...

云原生周刊:利用 eBPF 增强 K8s

开源项目推荐 Slurm-operator Slurm-operator 是一个高效可扩展的框架&#xff0c;用于在 K8s 环境中部署和运行 Slurm 工作负载。 它结合了 Slurm 的可靠性和 Kubernetes 的灵活性&#xff0c;支持快速部署 Slurm 集群、动态扩展 HPC 工作负载&#xff0c;并提供高度灵活的定…...

Ubuntu20.04安装openMVS<成功>.colmap<成功>和openMVG<失败(已成功)>

一、安装openMVS 官方文档&#xff1a;https://github.com/cdcseacave/openMVS/wiki/Building sudo apt-get -y install git mercurial cmake libpng-dev libjpeg-dev libtiff-dev libglu1-mesa-dev eigen git clone https://gitlab.com/libeigen/eigen --branch 3.4 mkdi…...

第22天:信息收集-Web应用各语言框架安全组件联动系统数据特征人工分析识别项目

#知识点 1、信息收集-Web应用-开发框架-识别安全 2、信息收集-Web应用-安全组件-特征分析 一、ICO图标&#xff1a; 1、某个应用系统的标示&#xff0c;如若依系统有自己特点的图标&#xff1b;一旦该系统出问题&#xff0c;使用该系统的网站都会受到影响&#xff1b; 2、某个公…...

Sourcegraph 概述

Sourcegraph 报告 Sourcegraph 是一款强大的代码搜索和智能导航工具&#xff0c;专为大型代码库、分布式系统和跨多个仓库的开发环境设计。它能显著提高开发者对复杂系统的理解和维护效率&#xff0c;帮助团队在庞大的代码库中快速找到关键信息。本文将详细讲解 Sourcegraph 的…...

Redis常见阻塞原因总结

O(n) 命令 Redis 中的大部分命令都是 O(1)时间复杂度&#xff0c;但也有少部分 O(n) 时间复杂度的命令&#xff0c;例如&#xff1a; KEYS *&#xff1a;会返回所有符合规则的 key。HGETALL&#xff1a;会返回一个 Hash 中所有的键值对。LRANGE&#xff1a;会返回 List 中指定…...

MyBatis执行完sql后,返回的数值代表的意思

在 MyBatis 中&#xff0c;常见的数据库操作方法返回的数值&#xff08;如 insert、update 和 delete&#xff09;代表了 受影响的行数&#xff0c;即数据库操作成功后&#xff0c;实际修改&#xff08;插入、更新或删除&#xff09;的记录数量。每个方法返回的数值有不同的含义…...

MySQL超详细安装配置教程(亲测有效)

目录 1.下载mysql 2.环境配置 3.安装mysql ​4.navicat工具下载与连接 ​5总结 1.下载mysql mysql下载--MySQL &#xff1a;&#xff1a; 下载 MySQL 社区服务器 下载的时候这里直接逃过就行 我这里的版本是最新的mysql8.0.37 下载完成之后,将压缩包进行解压 这里我建议大…...

MacroSan 2500_24A配置

双控制器电源同时按下,切记/切记/切记 默认信息 默认地址:192.168.0.210 输入ODSP授权后设置密码## 配置端口 物理资源–>设备–>网口–>eth-1:0:0或eth-2:0:0 创建存储池 存储资源–>存储池 介质类型:混合(支持机械及SSD)全闪(仅支持SSD) RAID类型:CRAID-P(基于磁…...

vue3+vite一个IP对站点名称的前端curd更新-会议系统优化

vue3-tailwind-todo https://github.com/kgrg/vue3-tailwind-todo 基于这个项目,把ip到sta的映射做了前端管理. 核心代码是存储和获得的接口,需要flask提供. def redis2ipdic():global ipdicipdic.clear()tmdiccl.hgetall(IPDIC_KEY)for k in tmdic.keys():ipdic[k.decode() …...

GraalVM完全指南:云原生时代下使用GraalVM将Spring Boot 3应用转换为高效Linux可执行文件

一、前言 在现代软件开发中,启动速度和资源利用率常常是衡量应用性能的关键指标。对于基于Spring Boot的应用来说,虽然它们易于开发和部署,但JVM的启动时间有时会成为一个瓶颈。本文介绍如何使用GraalVM将Spring Boot 3应用编译成原生Linux可执行文件,从而显著提高启动速度…...

《Swift 字面量》

《Swift 字面量》 介绍 在 Swift 编程语言中&#xff0c;字面量是一种表示源代码中固定值的表达方式。字面量可以直接表示数字、字符串、布尔值等基本数据类型&#xff0c;为编程提供了简洁和直观的方式。Swift 支持多种类型的字面量&#xff0c;包括整数字面量、浮点数字面量…...

国标GB28181平台EasyGBS在安防视频监控中的信号传输(电源/视频/音频)特性及差异

在现代安防视频监控系统中&#xff0c;国标GB28181协议作为公共安全视频监控联网系统的国家标准&#xff0c;该协议不仅规范了视频监控系统的信息传输、交换和控制技术要求&#xff0c;还为不同厂商设备之间的互联互通提供了统一的框架。EasyGBS平台基于GB28181协议&#xff0c…...

AlipayHK支付宝HK接入-商户收款(PHP)

一打开支付宝国际版 二、点开商户服务 三、下载源码...

CS!GO

CS&#xff08;computer science&#xff09;计算机科学&#xff0c;说实话&#xff0c;不是找工作面试&#xff0c;这些题谁会背啊&#xff0c;反正我不行&#xff0c;一问三不知。 咱也不管这些&#xff0c;这个系列&#xff0c;可能会时不时的给出一些计网和操作系统相关的东…...

全栈开发中的技术选型决策:快速上线与扩展的平衡

文章目录 摘要引言技术选型的重要性技术选型的关键考虑点项目需求团队技能技术生态性能与扩展性成本与复杂性 基于 Spring Boot 和 Vue.js 的全栈架构后端代码&#xff1a;Spring Boot 示例代码详解&#xff1a;运行原理&#xff1a; 前端代码&#xff1a;Vue.js 示例代码详解&…...

软件著作权申请教程(超详细)(2024新版)软著申请

目录 一、注册账号与实名登记 二、材料准备 三、申请步骤 1.办理身份 2.软件申请信息 3.软件开发信息 4.软件功能与特点 5.填报完成 一、注册账号与实名登记 首先我们需要在官网里面注册一个账号&#xff0c;并且完成实名认证&#xff0c;一般是注册【个人】的身份。中…...

【强化学习】Stable-Baselines3学习笔记

【强化学习】Stable-Baselines3学习笔记 Stable-Baselines3是什么安装ExampleReinforcement Learning Tips and TricksVecEnv相关 Stable-Baselines3是什么 Stable Baselines3&#xff08;简称SB3&#xff09;是一套基于PyTorch实现的强化学习算法的可靠工具集旨在为研究社区和…...

sqoop的参数有哪些?

Sqoop 是一款用于在 Hadoop 与关系型数据库之间进行数据传输的工具&#xff0c;它有很多参数&#xff0c;可分为通用参数、导入参数和导出参数等&#xff0c;以下是一些常见的参数介绍&#xff1a; 通用参数 --connect 说明&#xff1a;指定要连接的关系型数据库的 JDBC URL。…...

16×16LED点阵字符滚动显示-基于译码器与移位寄存器(设计报告+仿真+单片机源程序)

资料下载地址&#xff1a;​1616LED点阵字符滚动显示-基于译码器与移位寄存器(设计报告仿真单片机源程序)​ 1、功能介绍 设计1616点阵LED显示器的驱动电路&#xff0c;并编写程序实现在1616点阵LED显示器上的字符滚动显示。1616点阵LED显示器可由4块88点阵LED显示器构成。可采…...

后门移除方法和后门检测

1、后门移除方法 1.1、Fine-Pruning方法 [48]利用了这样一个观察结果&#xff1a;后门攻击会利用神经网络中的空闲容量。该方法通过消除在干净输入下处于休眠状态的神经元来减小网络的规模&#xff0c;然后对网络进行微调(使用干净数据继续训练)&#xff0c;以增强对抗修剪感…...

网络安全检测

实验目的与要求 (1) 帮助学生掌握木马和入侵的防护和检测方法、提高学习能力、应用能力和解决实际问题的能力。 (2) 要求学生掌握方法, 学会应用软件的安装和使用方法, 并能将应用结果展示出来。 实验原理与内容 入侵检测是通过对计算机网络或计算机系统中若干关键点收集信…...

FPGA(一)verilog语句基础

Verilog 是一种硬件描述语言&#xff08;HDL&#xff09;&#xff0c;常用于数字电路的设计、模拟和验证&#xff0c;特别是用于 FPGA 和 ASIC 的设计。Verilog 让设计者能够描述和模拟硬件系统的行为和结构&#xff0c;最终将其转化为硬件电路。 一、模块结构 Verilog 中的设计…...

istio配置重复的svc报错

现象&#xff1a; 两个vs中配置了同一个svc地址&#xff0c;导致其中的一个vs路由配置不生效&#xff0c;看到istiod服务的报错duplicate domain from service 解决&#xff1a; istiod服务报错日志 2024-11-13T14:54:50.39418167508:00 "pilot_vservice_dup_doma…...

springboot473基于web的物流管理系统(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统物流管理系统信息管理难度大&#xff0c;容错率低&#x…...

面试题整理7----Nginx的access.log被删除在不影响应用的情况下恢复日志的写入

面试题整理7----Nginx的access.log被删除在不影响应用的情况下恢复日志的写入 1. 问题2. 问题复现2. 释放空间2.1 确定nginx的pid2.2 确定文件描述符号2.3 清空文件 3. 恢复access.log的写入4. 后续改善 1. 问题 这是一个非常常见的故障处理. 应用负责人发现服务器磁盘满了,经…...

ip_forward函数

ip_forward 函数是 Linux 内核中用于处理 IP 数据包转发的重要函数。它负责将数据包从一个网络接口转发到另一个网络接口。以下是这个函数的一些关键点和工作流程的概述: 1. **数据包接收**:当一个数据包到达网络设备(如以太网卡)时,内核会首先接收到这个数据包。 2. **路…...

华院计算参与项目再次被《新闻联播》报道

12月17日&#xff0c;央视《新闻联播》播出我国推进乡村振兴取得积极进展。其中&#xff0c;华院计算参与的江西省防止返贫监测帮扶大数据系统被报道&#xff0c;该系统实现了由原来的“人找人”向“数据找人”的转变&#xff0c;有效提升监测帮扶及时性和有效性&#xff0c;守…...

postman关联接口用于登录(验证码会变情况)

目录 一、介绍 二、操作步骤 (一)Fiddler抓取到登录信息 (二)postman发送请求 新建请求一&#xff1a;登录值请求 (三)易变值赋值固定住 新建请求二&#xff1a;易变值验证码(uuid)请求 切换到请求一里面进行赋值绑定 一、介绍 接口有两种形式&#xff0c;一种是单…...

《探秘 Qt Creator Manual 4.11.1》

《探秘 Qt Creator Manual 4.11.1》 一、Qt Creator 4.11.1 概述二、功能特性全解析&#xff08;一&#xff09;跨平台能力展示&#xff08;二&#xff09;代码编辑优势&#xff08;三&#xff09;版本控制集成&#xff08;四&#xff09;特定 Qt 功能呈现&#xff08;五&#…...

linux(ubuntu )卡死怎么强制重启

&#xff08;公司的 ubuntu 跑个用例经常卡死&#xff09; 如果其他快捷键都没有反应&#xff0c;且不想按电源键进行硬重启&#xff0c;可以尝试以下方法&#xff1a; 1. 使用 Magic SysRq 键 Magic SysRq 键可以在系统完全卡死的情况下&#xff0c;执行一些强制操作来重启…...

优化程序中的数据:从数组到代数

前言 我们往往都希望优化我们的程序&#xff0c;使之达到一个更好的效果&#xff0c;程序优化的一个重点就是速度&#xff0c;加快速度的一个好办法就是使用并行技术&#xff0c;但是&#xff0c;并行时我们要考虑必须串行执行的任务&#xff0c;也就是有依赖关系的任务&#…...

图像配准有哪些技术?

目录 图像配准技术 1.基于特征的图像配准 2.基于强度的图像配准 3.基于模型的图像配准 4.基于学习的图像配准 5.混合方法 图像配准的应用 图像配准技术入门 常见问题解答 图像配准是计算机视觉和医学成像中的一项关键技术&#xff0c;用于将多幅图像对齐到一个共同的坐…...

第五节:GLM-4v-9b模型model加载源码解读(模型相关参数方法解读)

文章目录 前言一、GLM-4v-9b模型model加载源码解读1、GLM-4v-9b模型model加载主函数源码2、GLM-4v-9b模型model加载源码源码解读3、GLM-4v-9b自定义模型类源码解读 二、基于GLM-4v-9b模型获取模型输入参数等内容源码解读(from_pretrained-->huggingface)1、from_pretrained函…...

Unity3D仿星露谷物语开发7之事件创建动画

1、目标 掌握事件通知的Publisher - Subscriber设计模式&#xff0c;并通过事件通知触发动画。 2、发布者/订阅者模式 首先&#xff0c;定义事件Event 然后&#xff0c;Publisher触发事件 最后&#xff0c;Subscriber订阅事件并进行处理 &#xff08;1&#xff09;创建动作…...

学校知网中的加锁论文下载不了怎么办

最近有同学求助在学校下载知网论文&#xff0c;有加锁标识的论文下载不了。这是因为各高校订购的都不是数据库全库&#xff0c;加锁的论文是超出订购范围的资源所以下载不了。下面就来讲下解决办法&#xff1a; 首先选一个涵盖数据库多&#xff0c;各个数据库资源权限高的文献…...

算法 双指针技巧

文章目录 双指针[leetcode167 两数之和](https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted/description/)分析题解 [leetcode88 合并两个有序数组](https://leetcode.cn/problems/merge-sorted-array/description/)分析题解 [leetcode142 环形链表](https://lee…...

Spring Boot注解总结大全【案例详解,一眼秒懂】

SpringBootApplication 功能&#xff1a;这是Spring Boot应用的核心注解&#xff0c;它是一个组合注解&#xff0c;实际上相当于同时使用了Configuration、EnableAutoConfiguration和ComponentScan。它标记在主应用类上&#xff0c;用于开启Spring Boot的自动配置功能&#xff…...

手动修改nginx-rtmp模块,让nginx-rtmp-module支持LLHLS

文章目录 1. 背景2. 开发环境搭建2.1 ffmpeg在ubuntu上安装2.2 nginx-rtmp-module在ubuntu上安装2.3 安装vscode环境2. 修改nginx-rtmp-module2.1 主要更新内容2.2 新增配置项2.3 代码更新3. LLHLS验证方法3.1 配置验证3.2 功能验证4. 注意事项5. 已知问题6. 后续计划1. 背景 …...

在Visual Studio 2022中配置C++计算机视觉库Opencv

本文主要介绍下载OpenCV库以及在Visual Studio 2022中配置、编译C计算机视觉库OpenCv的方法 1.Opencv库安装 ​ 首先&#xff0c;我们需要安装OpenCV库&#xff0c;作为一个开源库&#xff0c;我们可以直接在其官网下载Releases - OpenCV&#xff0c;如果官网下载过慢&#x…...

Unity全局雾效

1、全局雾效是什么 全局雾效&#xff08;Global Fog&#xff09;是一种视觉效果&#xff0c;用于在3D场景中模拟大气中的雾气对远处物体的遮挡 它通过在场景中加入雾的效果&#xff0c;使得距离摄像机较远的物体看起来逐渐被雾气覆盖&#xff0c;从而创造出一种朦胧、模糊的视…...

2024 高频 Java 面试合集整理 (1000 道附答案解析)

2024 年马上就快要过去了&#xff0c;总结了上半年各类 Java 面试题&#xff0c;初中级和中高级都有&#xff0c;包括 Java 基础&#xff0c;JVM 知识面试题库&#xff0c;开源框架面试题库&#xff0c;操作系统面试题库&#xff0c;多线程面试题库&#xff0c;Tcp 面试题库&am…...

Java CPU飙升 排查

一、概述 CPU 是整个电脑的核心计算资源&#xff0c;CPU的最小执行单元是 线程&#xff1b; 在现代操作系统中&#xff0c;进程和线程是两种主要的调度单位&#xff1b; 进程是程序中正在运行的一个应用程序&#xff0c;而线程是系统分配处理器时间资源的基本单位。一个进程至少…...

vue中的css深度选择器v-deep 配合!important

当 <style> 标签有 scoped 属性时&#xff0c;它的 CSS 只作用于当前组件中的元素&#xff0c;父组件的样式将不会渗透到子组件。 如果你希望 scoped 样式中的一个选择器能够作用得“更深”&#xff0c;例如影响子组件&#xff0c;你可以使用深度选择器。 ::v-deep { } 举…...