Golang 基准测试(Benchmark)
Benchmark 🧪
基准测试是对计算机系统的性能的测试。
在程序中,基准测试,是一种测试代码性能的方法;比如有一个问题你有多种不同的方案,你想选择一种性能最好的方案,那么你就需要基准测试。
基准测试主要是通过测试 CPU 和内存的效率问题,来评估被测试代码的性能,进而找到更好的解决方案。比如链接池的数量不是越多越好,那么哪个值才是最优值呢,这就需要配合基准测试不断调优了。
工程意图
仓库: https://github.com/guzhongren/TDD/tree/master/09.benchmar
根据输入的字符串和重复次数,输出重复次数后的字符串。
初始化工程
go mod init benchmark
测试的函数需要以 Test 开头,参数为 *testing.T 类型
Test
- 测试先行
# 测试 Repeat 函数 func TestRepeat(t *testing.T) { actual := Repeat(`a`, 6) expect := `aaaaaa` if actual != expect { t.Errorf(`expect %s, but got %s`, expect, actual) } }
- 运行 go test, 程序会报错,因为没有实现 Repeat 函数。
- 最小化的实现 Repeat
// Repeat return a string with same char func Repeat(char string, count int) (result string) { for i := 0; i < count; i++ { result += char } return }
上面的函数中 return 并没有返回值,是因为,在 Repeat 函数的返回值部分有一个result,
当返回值是函数体里面的值的时候,可以不用写返回值,go 程序自动将该值返回。但return 依旧不能省略。
Benchmark
基准测试的函数名须以 Benchmark 开头, 参数须为 *testing.B;循环中的 b.N, go 会根据系统情况生成,不用用户设定。
func BenchmarkRepeat(b *testing.B) { for i := 0; i < b.N; i++ { Repeat(`b`, 5) } }
运行测试
- 基本测试
$ go test PASS ok benchmark 0.006s
基本测试很简单,不用解读了。
- 基准测试
$ go test -bench=. -run=none goos: darwin goarch: amd64 pkg: benchmark BenchmarkRepeat-12 10000000 116 ns/op PASS ok benchmark 1.297s
运行基准测试也要使用go test命令,不过我们要加上-bench=标记,它接受一个表达式作为参数,匹配基准测试的函数,. 表示运行所有基准测试。
因为默认情况下 go test 会运行单元测试,为了防止单元测试的输出影响我们查看基准测试的结果,可以使用-run=匹配一个从来没有的单元测试方法,过滤掉单元测试的输出,我们这里使用none,因为我们基本上不会创建这个名字的单元测试方法。
下面着重解释下说出的结果,看到函数后面的-12了吗?这个表示运行时对应的 GOMAXPROCS 的值。接着的 10000000 表示运行 for 循环的次数,也就是调用被测试代码的次数,最后的 116 ns/op表示每次需要话费 116 纳秒。
以上是测试时间默认是1秒,也就是1秒的时间,调用 10000000 次,每次调用花费 116 纳秒。如果想让测试运行的时间更长,可以通过 -lunchtime 指定,比如5秒。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
ERC20合约交易监听的PHP实现代码
EthMon开发包用于监听以太坊ERC20代币合约的转账交易,官方下载地址:http://sc.hubwiz.com/codebag/ethmon-php/。 1、开发包概述 EthMon代币交易监听开发包特点如下: 监听以太坊合约日志中指定地址发生的代币转入/转出交易 自定义代币交易发生时的业务逻辑 即支持标准的Web3接口(例如Infura),也支持Etherscan非标接口 EthMon运行于PHP 7.1+环境下,主要类以及其关系如下图所示: EthMon的主要代码文件清单如下: 文件路径 说明 ethtool/src/ EthMon源代码目录 ethtool/src/EthMon.php EthMon入口类 ethtool/src/EthApi.php 以太坊API基类 ethtool/src/EthApiEtherscan.php EthApi的Etherscan继承类 ethtool/src/EthApiWeb3.php EthApi的Web3继承类 ethtool/src/LogParser.php 以太坊日志解析类 ethtool/src/IEventListener...
- 下一篇
Dokit支持iOS本地crash查看功能
一、前言 在日常开发中或者测试过程中,我们的应用可能会出现Crash的问题。对于这类问题我们要抱着零容忍的态度,因为如果线上出现了这类问题,将会严重影响用户的体验。 如果Crash出现的时候恰好是在开发过程中,那么开发者可以根据Xcode的调用堆栈或者控制台输出的信息来定位问题的原因。但是,如果是在测试过程中的话就比较麻烦了。常见的两种解决方案是: 直接把测试手机拿来连接Xcode查看设备信息中的日志。 需要测试同学给出Crash的复现路径,然后开发者在调试过程中进行复现。 不过,以上两种方式都不是很方便。那么问题来了,有没有更好的方式查看Crash日志?答案当然是肯定的。DoraemonKit的常用工具集中的Crash查看功能就解决了这个问题,可以直接在APP端查看Crash日志,下面我们来介绍下Crash查看功能的实现。 二、技术实现 在iOS的开发过程中,会出现各种各样的Crash,那如何才能捕获这些不同的Crash呢?其实对于常见的Crash而言,可以分为两类,一类是Objective-C异常,另一类是Mach异常,一些常见的异常如下图所示: 下面,我们就来看下这两类异常应当如...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2整合Redis,开启缓存,提高访问速度
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)