Go语言基准测试(benchmark)三部曲之一:基础篇

这篇具有很好参考价值的文章主要介绍了Go语言基准测试(benchmark)三部曲之一:基础篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

关于基准测试(benchmark)

  • Go的标准库内置的testing框架提供了基准测试(benchmark)功能,可以用来验证本地方法在串行或者并行执行时的基准表现,帮助开发者了解代码的真实性能情况,例如一个方法执行一次的平均耗时,还能看到内存分配的情况

关于Go语言基准测试(benchmark)三部曲

  • 《Go语言基准测试(benchmark)三部曲》是欣宸的优异又一些列原创,旨在通过简单的编码实战与大家一同学习和巩固基准测试的常见操作,共分为:基础篇、内存篇、提高篇三部分,每篇都目标明确,用少量代码和命令快速熟悉对应知识点,相信《三部曲》结束后,您也能轻松完成基准测试,根高效的检查代码性能

本篇概览

  • 作为系列的开篇,本文的目标是和大家一起快速开始基准测试,然后将常用的参数和命令都用上一遍,具体步骤如下
  1. 编码,写个本地方法,后面就用benchmark来验证这些方法的性能
  2. 最基本的基准测试
  3. 匹配规则
  4. -cpu参数
  5. -benchtime参数
  6. -count参数
  7. 并行测试

环境信息

  • 操作系统:Windows 11 家庭中文版(22H2),12代i5处理器,16G内存
  • Go:1.19.3
  • VSCode:1.75.1

编码

  • benchmark是用来对已有方法做测试的,因此一开始要把被测试的方法准备好,然后像单元测试那样编写benchmark测试代码,最后用go test做基准测试,咱们这就动手把方法准备好
  • 准备一个目录,名为benchmark-demo,在目录下执行以下命令,新建一个module
go mod init benchmark-demo
  • 用vscode打开此目录,会识别到module,接下来可以在vscode中操作了
  • 新建文件benchmark-demo,里面是用来做基准测试的方法,先写一个简单的方法fib
package main

// 斐波拉契数列
func fib(n int) int {
	if n == 0 || n == 1 {
		return n
	}

	return fib(n-2) + fib(n-1)
}
  • 接下来就用benchmark来测试fib方法,看看其性能情况

最基本的基准测试

  • 最基本的基准测试是从两个维度去检测方法的性能
  1. 指定时间内,检查方法的运行的耗时
  2. 指定次数,检查方法的运行的耗时
  • 具体操作分为两部
  1. 写benchmark测试方法,就像写单元测试代码一样,代码位于_test.go结尾的文件中
  2. 执行benchmark测试
  • 先来写benchmakr测试方法,新建名为main_test.go,里面有个方法BenchmarkFib,注意要以Benchmark开始,入参是*testing.B类型,这就是最简单的benchmark方法了
func BenchmarkFib(b *testing.B) {
	for n := 0; n < b.N; n++ {
		fib(30)
	}
}
  • 现在用命令行进行测试,执行下面这个最精简的命令,注意:要执行benchmark测试就要带-bench
go test -bench .
  • 很快就完成了基准测试,控制台输出如下,具体含义稍后解释
goos: windows
goarch: amd64
pkg: benchmark-demo
cpu: 12th Gen Intel(R) Core(TM) i5-1240P
BenchmarkFib-16              322           3653937 ns/op
PASS
ok      benchmark-demo  1.999s
  • 最前面几行是基本信息, 整理如下
名称 含义
goos 操作系统,这里是windows
goarch CPU架构,这里是64位X86
pkg package名,可以在测试的时候指定package
cpu CPU的信息,这里可以看到是12代酷睿i5
  • 接下来是benchmark的结果,每个数字的具体解释如下图所示
    Go语言基准测试(benchmark)三部曲之一:基础篇
  • benchmark也可以像普通单元测试那样添加验证逻辑的代码,测试结果可以是通过和不通过,BenchmarkFib中没有像普通单元测试那样的失败逻辑,因此最终的判断是测试通过,控制台中输出了PASS
  • 将同样的测试在M1 Pro芯片的Mac Book Pro上运行一遍试试,获取结果如下,可见和前面的windows测试结果大致相近,不同的是结果中没有CPU信息
go test -bench .
goos: darwin
goarch: arm64
pkg: benchmark-demo
BenchmarkFib-8   	     326	   3647077 ns/op
PASS
ok  	benchmark-demo	1.654s
  • 以上就是最基础的benchmark测试了,咱们已经验证了,接下来试试那些常用的参数

匹配规则

  • 在有多个Benchmark测试方法的时候,如何做到只运行指定的方法呢?
  • 先看指定package的
  1. 指定package:go test -bench benchmark-demo
  2. 指定子package:go test -bench benchmark-demo/XXX
  3. 当前目录下的所有package:go test -bench ./... (斜杠左侧是一个点,右侧是三个点)
  • 再看指定方法的,可以用正则表达式来指定方法名
  1. 所有以Fib结尾的方法:go test -bench='Fib$' benchmark-demo
  2. 所有以BenchmarkNew开始的方法:go test -bench='^BenchmarkNew' benchmark-demo
  • 接下来看几个常用参数

-cpu参数

  • 前面的测试结果BenchmarkFib-16可以看出测试中的GOMAXPROCS等于16,这个值可以用-cpu参数来调整,不过咱们这里不涉及并发编程,GOMAXPROCS的变化对测试结果没有影响,改一下试试,果然没啥波动(稍后还会讲到并行测试,那时候cpu参数的作用就非常明显了)
go test -bench='Fib$' -cpu=2 .  
goos: windows
goarch: amd64
pkg: benchmark-demo
cpu: 12th Gen Intel(R) Core(TM) i5-1240P
BenchmarkFib-2               320           3692123 ns/op
PASS
ok      benchmark-demo  1.962s

-benchtime参数

  • 前面的命令中我们并没有指定测试时长,因此使用的是默认值1秒,现在咱们来修改这个参数试试,毕竟1秒内完成基准测试并不是普遍适用的
  • 指定基准测试时长为10秒:go test -bench='Fib$' -benchtime=10s benchmark-demo
  • 结果如下
goos: windows
goarch: amd64
pkg: benchmark-demo
cpu: 12th Gen Intel(R) Core(TM) i5-1240P
BenchmarkFib-16             3264           3668947 ns/op
PASS
ok      benchmark-demo  12.710s
  • 除了指定时间,还能指定次数,就是指定下图黄色箭头所指的值,也就是控制了被测试方法所执行的次数
    Go语言基准测试(benchmark)三部曲之一:基础篇
  • 指定每轮基准测试内的循环次数为999次:go test -bench='Fib$' -benchtime=999x benchmark-demo
  • 注意将-benchtime的值从10s改为999x,测试范围就从时间变成了次数,测试结果如下,可见准确的执行了999次
go test -bench='Fib$' -benchtime=999x benchmark-demo
goos: windows
goarch: amd64
pkg: benchmark-demo
cpu: 12th Gen Intel(R) Core(TM) i5-1240P
BenchmarkFib-16              999           3667776 ns/op
PASS
ok      benchmark-demo  4.006s

-count参数

  • count参数也是用来控制执行次数的,和前面提到的benchtime不同,count用来控制BenchmarkXXX方法的调用次数,而benchtime是用来控制BenchmarkXXX方法的入参b.N的值,如下图所示
    Go语言基准测试(benchmark)三部曲之一:基础篇
  • 指定每轮基准测试内的循环次数为999次,一共两轮:go test -bench='Fib$' -benchtime=999x -count=2 benchmark-demo,输出如下,还是很容易理解的
go test -bench='Fib$' -benchtime=999x -count=2 benchmark-demo
goos: windows
goarch: amd64
pkg: benchmark-demo
cpu: 12th Gen Intel(R) Core(TM) i5-1240P
BenchmarkFib-16              999           3656639 ns/op
BenchmarkFib-16              999           3645846 ns/op
PASS
ok      benchmark-demo  7.709s

并行测试

  • 前面的BenchmarkFib是常规的串行测试,如果被测试的方法在真实环境中存在并发调用,那么在基准测试中也应该通过并行测试来了解其基本性能(例如锁造成的阻塞)
  • 为了对fib方法做并行基准测试,需要编写对应的基准测试代码,如下
func BenchmarkParallelFib(b *testing.B) {
	b.RunParallel(func(pb *testing.PB) {
		for pb.Next() {
			fib(30)
		}
	})
}
  • 执行go test -bench='^Benchmark' benchmark-demo,这时BenchmarkFibBenchmarkParallelFib都会执行,测试结果如下,可见相同时间内,执行fib的总次数是随着并发数量而增加
go test -bench='^Benchmark' benchmark-demo       
goos: windows
goarch: amd64
pkg: benchmark-demo
cpu: 12th Gen Intel(R) Core(TM) i5-1240P
BenchmarkFib-16                      368           3362756 ns/op
BenchmarkParallelFib-16             3134            370352 ns/op
PASS
ok      benchmark-demo  3.189s
  • 通过cpu参数指定GOMAXPROCS数量,执行命令go test -bench='^Benchmark' -cpu=8 benchmark-demo,结果如下,可见串行方法的测试结果没有变化,而并行测试的结果随着GOMAXPROCS的减少有明显下降
go test -bench='^Benchmark' -cpu=8 benchmark-demo
goos: windows
goarch: amd64
pkg: benchmark-demo
cpu: 12th Gen Intel(R) Core(TM) i5-1240P
BenchmarkFib-8                       356           3352500 ns/op
BenchmarkParallelFib-8              1989            582177 ns/op
PASS
ok      benchmark-demo  3.211s
  • 最后注意,除了cpu参数,前面用过的benchtime和count也都适用于并行测试,含义和串行测试的场景一致
  • 至此,最基本的基准测试已经完成了,下一篇咱们会进行内存相关的基准测试,观察内存的使用和分配情况,敬请期待

欢迎关注博客园:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...文章来源地址https://www.toymoban.com/news/detail-735646.html

到了这里,关于Go语言基准测试(benchmark)三部曲之一:基础篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Docker学习三部曲】—— 入门篇

    1️⃣ 什么是 docker ? Docker 是 一种运行应用程序的平台,它可以使应用程序在容器中不受环境差异的影响进行部署和运行 。Docker 的流行度越来越高,是因为它可以帮助在不同的开发者和开发团队之间实现代码的共享和协同开发,并且大大 简化了应用程序的部署,提高了可移

    2023年04月20日
    浏览(49)
  • JavaCV人脸识别三部曲之二:训练

    这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本文是《JavaCV人脸识别三部曲》的第二篇,前文《视频中的人脸保存为图片》咱们借助摄像头为两位群众演员生成大量人脸照片,如下图,群众演员A的照片保存在 E:temp20211218\\001 man ,B的照片保存

    2024年02月11日
    浏览(37)
  • Java版人脸跟踪三部曲之三:编码实战

    这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 作为《Java版人脸跟踪三部曲》系列的终篇,本文会与大家一起写出完整的人脸跟踪应用代码 前文《开发设计》中,已经对人脸跟踪的核心技术、应用主流程、异常处理等方方面面做了详细设计,建

    2024年02月12日
    浏览(37)
  • JavaCV人脸识别三部曲之三:识别和预览

    这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 《视频中的人脸保存为图片》 《训练》 《识别和预览》 作为《JavaCV人脸识别三部曲》的终篇,今天咱们要开发一个实用的功能:有人出现在摄像头中时,应用程序在预览窗口标注出此人的身份,效

    2024年02月11日
    浏览(39)
  • Java版人脸跟踪三部曲之二:开发设计

    如何开发Java版人脸跟踪应用?本篇给出了设计大纲,并解释了相关的重要知识点 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇是《Java版人脸跟踪三部曲》系列的第二篇,前文体验了人脸跟踪的效果,想要编码实现这样的效果,咱们需要做

    2024年02月12日
    浏览(41)
  • vscode上的git三部曲+git pull操作

    git三部曲:git add .、git commit -m \\\'\\\'、git push,命令在连接远程仓库的本地仓库路径下的终端执行。 vscode上的可视化操作如下:  1、对仓库里的文件做更改,让仓库操作的地方有变化。 2、 点击+号,让文件进入缓存,此步骤相当于终端执行命令git add .  3、在这里输入信息并点击

    2024年02月11日
    浏览(39)
  • 大模型 Dalle2 学习三部曲(二)clip学习

    clip论文比较长48页,但是clip模型本身又比较简单,效果又奇好,正所谓大道至简,我们来学习一下clip论文中的一些技巧,可以让我们快速加深对clip模型的理解,以及大模型对推荐带来革命性的变化。 首选我们来看看clip的结构,如图clip结构比较直观,训练的时候把文本描述

    2024年02月09日
    浏览(38)
  • 【C++系列P4】‘类与对象‘-三部曲——[类](2/3)

     前言 大家好吖,欢迎来到 YY 滴 C++系列 ,热烈欢迎! 【 \\\'类与对象\\\'-三部曲】的大纲主要内容如下 : 如标题所示,本章是【 \\\'类与对象\\\'-三部曲】三章中的第二章节—— 类章节 ,主要内容如下: 目录 一.类 1.类的组成与计算类的大小(含结构体内存对齐规则) 二. 空类的大小

    2024年02月08日
    浏览(40)
  • 数据结构:堆的三部曲(二)top K问题

    top k问题解决的是获取前几个最值的问题。 我们知道 堆的功能主要是选数,选出最大值或者最小值 。那么我们每次获取堆顶元素后,再将剩余元素调整成堆,就可以选出次大的数,如果我们只想要前k个最大值或者最小值,就只需要获取堆顶元素k次,调整k次。比如王者荣耀

    2024年02月02日
    浏览(40)
  • 【C++系列P5】‘类与对象‘-三部曲——[对象&特殊成员](3/3)

     前言 大家好吖,欢迎来到 YY 滴 C++系列 ,热烈欢迎! 【 \\\'类与对象\\\'-三部曲】的大纲主要内容如下 : 如标题所示,本章是【 \\\'类与对象\\\'-三部曲】三章中的第三章节——对象成员章节,主要内容如下: 目录 一.const成员/成员函数 一.用const修饰this指针的好处——含权限知识点

    2024年02月06日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包