Golang 基准测试Benchmark
基准测试
Go语言标准库内置的 testing 测试框架提供了基准测试(benchmark)的能力,实现了对某个特定目标场景的某项性能指标进行定量的和可对比的测试。
基本规则
- 基准测试的代码文件必须以_test.go结尾
- 基准测试的函数必须以Benchmark开头,必须是可导出的
- 基准测试函数必须接受一个指向Benchmark类型的指针作为唯一参数
- b.ResetTimer是重置计时器,这样可以避免for循环之前的初始化代码的干扰
- 最后的for循环很重要,被测试的代码要放到循环里
- b.N是基准测试框架提供的,表示循环的次数,因为需要反复调用测试的代码,才可以评估性能
常用命令
$ go test -bench=. -benchmem
- 使用
-bench=.标记,它接受一个表达式作为参数,匹配基准测试的函数,.表示运行所有基准测试。 - 使用
-benchmem提供每次操作分配内存的次数,以及每次操作分配的字节数。 - 使用
-run=none匹配单元测试方法,这里使用none是因为没有这个名字的单元测试方法,等效于过滤掉单元测试的输出。 - 使用
-benchtime=3s指定测试的时间,例如3秒,测试时间默认是1秒。 - 使用
-count=3用来设置 benchmark 的轮数。例如,进行3轮benchmark。
举个栗子
评估1000个字符串的连接性能,分别使用 + 操作符、bytes.Buffer和strings.Builder 进行测试。
package main
import (
"bytes"
"strings"
"testing"
)
var strLen = 1000
func BenchmarkConcatString(b *testing.B) {
var str string
i := 0
b.ResetTimer()
for n := 0; n < b.N; n++ {
str += "x"
i++
if i >= strLen {
i = 0
str = ""
}
}
}
func BenchmarkConcatBuffer(b *testing.B) {
var buffer bytes.Buffer
i := 0
b.ResetTimer()
for n := 0; n < b.N; n++ {
buffer.WriteString("x")
i++
if i >= strLen {
i = 0
buffer = bytes.Buffer{}
}
}
}
在终端运行命令 go test -bench=. -benchmem,输入如下信息:
$ go test -bench=^BenchmarkConcat -benchmem
goos: darwin
goarch: amd64
pkg: go_learning_notes/benchmark
cpu: Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz
BenchmarkConcatString-4 8040235 140.5 ns/op 530 B/op 0 allocs/op
BenchmarkConcatBuffer-4 168521010 6.384 ns/op 2 B/op 0 allocs/op
BenchmarkConcatBuilder-4 464368256 2.475 ns/op 2 B/op 0 allocs/op
PASS
ok go_learning_notes/benchmark 5.035s
通过上面的指标信息,可以得出结论 bytes.Buffer和strings.Builder 比 + 操作符 更快。
参考文章
- Practical Go Benchmarks:https://www.instana.com/blog/practical-golang-benchmarks/
- Benchmarks of Go serialization methods:https://github.com/alecthomas/go_serialization_benchmarks
- Debugging performance issues in Go programs:https://github.com/golang/go/wiki/Performance
Golang 基准测试Benchmark的更多相关文章
- Golang ---基准测试
什么是基准测试 基准测试,是一种测试代码性能的方法,比如你有多种不同的方案,都可以解决问题,那么到底是那种方案性能更好呢?这时候基准测试就派上用场了. 基准测试主要是通过测试CPU和内存的效率问题,来 ...
- 【原创】linux实时操作系统xenomai x86平台基准测试(benchmark)
一.前言 benchmark 即基准测试.通常操作系统主要服务于应用程序,其运行也是需要一定cpu资源的,一般来说操作系统提供服务一定要快,否则会影响应用程序的运行效率,尤其是实时操作系统.所以本文针 ...
- CI框架源码阅读笔记5 基准测试 BenchMark.php
上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功 ...
- golang 性能优化分析:benchmark 结合 pprof
前面 2 篇 golang 性能优化分析系列文章: golang 性能优化分析工具 pprof (上) golang 性能优化分析工具 pprof (下) 一.基准测试 benchmark 简介 在 ...
- 如何对你的Python代码进行基准测试
啥叫做基准测试(benchmark)代码?其实主要就是测试(benchmarking)和分析(profiling)你的代码执行多快,并且找到代码瓶颈(bottlenecks)在哪里. 执行该动作的主要 ...
- MySQL基准测试工具
一.基准测试 基准测试(benchmark)是针对系统设计的一种压力测试. 基准测试是简化了的压力测试. 1.1 常见指标 TPS QPS 响应时间 并发量 1.2 收集与分析数据脚本 收集数据的sh ...
- 盘点Go中的开发神器
本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 在Java中,我们用Junit做单元测试,用JMH做性能基准测试(benchmark),用as ...
- 高性能MySQL第2,3章性能相关 回顾笔记
1. 基准测试(benchmark) 不管是新手还是专家都要熟悉基准测试,benchmark测试是对系统的一种压力测试,目标是为了掌握在特定压力下系统的行为.也有其他原因:如重现系统状态,或者是 ...
- webpack摸索笔记
上一个链接,入门webpack看这篇文章最好:https://segmentfault.com/a/1190000006178770 1.先安装好node 2.建个项目文件 3,.window+r,打 ...
随机推荐
- LuoguB2133 我家的门牌号 题解
Update \(\texttt{2021.11.27}\) 修复了代码中的 \(10000\) 写成 \(n\) 的错误. Content 一个家庭住在一个胡同里面,门牌号从 \(1\) 开始编号. ...
- idea删除同一个模块后新建模块显示被占用
当我们某个模块因为什么原因需要删除重建的时候 ,输入完模块名称并不能创建出来,这是因为模块已经被注册 解决办法: 1.右键点击项目名称---选择Load/Unload Modules 2.将已经删除的 ...
- c++指针函数和函数指针概述
欢迎指正 代码写的不够规范: 目的是缩短文章篇幅,实际中请注意 阅读完本文, 你一定能判断和写出:指针函数和函数指针. 0.结论 A.指针函数: 函数的返回值是指针类型 B.函数指针: 函数名是一个指 ...
- 【LeetCode】835. Image Overlap 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】498. Diagonal Traverse 解题报告(Python)
[LeetCode]498. Diagonal Traverse 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: htt ...
- 【LeetCode】154. Find Minimum in Rotated Sorted Array II 解题报告(Python)
[LeetCode]154. Find Minimum in Rotated Sorted Array II 解题报告(Python) 标签: LeetCode 题目地址:https://leetco ...
- 慢 SQL 优化
# 导致SQL执行慢的原因 1. 硬件问题.如网络速度慢,内存不足,I/O吞吐量小,磁盘空间满了等. 2. 没有索引或者索引失效.(一般在互联网公司,DBA会在半夜把表锁了,重新建立一遍索引,因为当你 ...
- Variational Inference with Normalizing Flow
目录 概 主要内容 一些合适的可逆变换 代码 Rezende D., Mohamed S. Variational Inference with Normalizing Flow. ICML, 201 ...
- PlatformIO+Jlink进行调试
PlatformIO自带调试功能具体配置如下 https://docs.platformio.org/en/latest/plus/debug-tools/jlink.html 我是用的是直接 ...
- Null和空值对于avg计算时产生的影响以及处理
为什么要关注这一块呢:1.面试中可能会有涉及 2.工作中真的也可能会用,既然有可能我也用过,就拿出来跟大家分享一下,上一篇的博文,数据已准备好就不做数据准备的介绍了. step1:select * f ...