go benchmark 性能测试 单元测试 基准测试 使用方法详解
简言
基准测试是测量一个程序在固定工作负载下的性能
在Golang中,基准测试函数以Benchmark为前缀并且带有一个 *testing.B 类型的参数
规则
- 基准测试的代码文件必须以_test.go结尾
- 基准测试的函数必须以Benchmark开头
- 基准测试函数必须接受一个指向Benchmark类型的指针作为唯一参数,即比如func BenchmarkMapkeys1(b *testing.B)
- 基准测试函数不能有返回值
- b.ResetTimer是重置计时器,这样可以避免for循环之前的初始化代码的干扰
- 最后的for循环很重要,被测试的代码要放到循环里
- b.N是基准测试框架提供的,表示循环的次数,因为需要反复调用测试的代码,才可以评估性能
- 不要修改b.N,因为基准测试是很智能的,它会自动根据你要测试函数的运行时间动态调整该值
- b.N 从 1 开始,如果基准测试函数在1秒内就完成 (默认值),则 b.N 增加,并再次运行基准测试函数。b.N 在近似这样的序列中不断增加;1, 2, 3, 5, 10, 20, 30, 50, 100,1000,20000 等等。 基准框架试图变得聪明,如果它看到当b.N较小而且测试很快就完成的时候,它将让序列增加地更快
示例:(测试int转string的SprIntf()函数的效率)
package test
import ("fmt""testing"
)
func BenchmarkTest1(b *testing.B) {for i := 0; i < b.N; i++ {_ = fmt.Sprintf("%d", i)}
}
实验结果如下图(请注意红框中的,比如文件名,函数名,测试命令):
测试结果分析:
1. BenchmarkTest1-4 表测试的函数名,-4 表示GOMAXPROCS(线程数)的值为4
2. 10000000 表一共执行了一千万次,即B.N的值
3. 107 ns/op表平均每次操作花费了107纳秒
4. 16 B/op 表每次操作申请了16Byte的内存申请
5. 2 allocs/op 表每次操作申请了2次内存
参数介绍
1. 参数-bench,它指明要测试的函数;点字符意思是测试当前所有以Benchmark为前缀函数
2. 参数-benchmem,性能测试的时候显示测试函数的内存分配大小,内存分配次数的统计信息
3. 参数-count n,运行测试和性能多少此,默认一次
PS:
有些时候在benchmark之前需要做一些准备工作,并且,我们不希望这些准备工作纳入到计时里面,我们可以使用 b.ResetTimer(),代表重置计时为0,以调用时的时刻作为重新计时的开始
go benchmark 性能测试 单元测试 基准测试 使用方法详解相关推荐
- mysql查询性能测试工具_MySQL性能测试工具MySQLslap使用实例详解
原标题:MySQL性能测试工具MySQLslap使用实例详解 MySQLslap是MySQL(了解干货请戳:干货!超过500行的Mysql学习笔记)自带的基准测试工具,优点:查询数据,语法简单,灵活容 ...
- Java基准测试工具JMH详解
Java基准测试工具JMH详解 1.JMH概述 1.1 JMH简介 1.2 JMH与JMeter区别 1.3 JMH注解说明 2.JMH验证 2.1 创建项目 2.2 引入依赖 2.3 启动异常解决 ...
- pycharm 运行celery_在 Pycharm 安装使用black的方法详解
PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Project管理.代码跳转.智能提示.自动完 成.单元测试.版本控制 ...
- MP实战系列(十一)之封装方法详解(续一)
之前写的封装方法详解,比较简要. 今天我主要讲增加和删除及其修改.查的话得单独再详讲. 增删改查,无论是Java或者C#等等,凡是对数据库操作的都离不开这四个. 一.增加方法讲解 MyBatis Pl ...
- python统计csv行数_对Python 多线程统计所有csv文件的行数方法详解
如下所示: #统计某文件夹下的所有csv文件的行数(多线程) import threading import csv import os class MyThreadLine(threading.Th ...
- python修改文件内容_Python批量修改文本文件内容的方法详解
这篇文章主要介绍了Python批量修改文本文件内容的方法的相关资料,需要的朋友可以参考下 Python批量替换文件内容,支持嵌套文件夹 import os path="./" fo ...
- python二维元组_python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
如何去读取一个没有表头的二维csv文件(如下图所示)? 并以元组的形式表现数据: ((1.0, 0.0, 3.0, 180.0), (2.0, 0.0, 2.0, 180.0), (3.0, 0.0, ...
- Spring JdbcTemplate方法详解
2019独角兽企业重金招聘Python工程师标准>>> Spring JdbcTemplate方法详解 标签: springhsqldbjava存储数据库相关sql 2012-07- ...
- golang 解析php序列化,golang实现php里的serialize()和unserialize()序列和反序列方法详解...
Golang 实现 PHP里的 serialize() . unserialize() 安装 go get -u github.com/techleeone/gophp/serialize 用法 pa ...
最新文章
- vue 获取当前时间 格式YYYY-MM-DD
- appium1.6在mac上环境搭建启动ios模拟器上Safari浏览器 转自:上海-悠悠
- 对话框中WaitForSingleObject等待线程退出导致程序阻塞的原因及解决
- 【机器学习】逻辑回归代码练习
- java替换数组中的元素_如何使用Java 8流快速替换列表中的元素
- const 和readonly
- 解决flask端口被占用的问题
- git github gitlib gitlab
- python设计贪吃蛇游戏论文_用Python写一个贪吃蛇AI,让程序自己玩游戏
- Winform里面的缓存,MemoryCache使用
- Docker系列教程06-实战:修改Nginx首页
- link 和 style 元素在 HTML 文档中的位置
- UltraISO 对光盘镜像常用操作方法图解
- JS的IE和Firefox兼容性汇编(原作:hotman_x)
- Python学习必看书籍_带你高效学习
- 计算机维修培训教材,计算机芯片级维修中心芯片级维修培训教材.pdf
- WebStorm-2021.1.1下载及安装
- Propensity Score Matching
- 程序开发中常用的第三方API接口汇总,包含各种类别的介绍
- 【宋红康 MySQL数据库】【基础版】【15】存储过程与存储函数
热门文章
- 添加three20模板的方法
- mysql数据库引擎调优
- CodeForces - 1486C2 Guessing the Greatest (hard version)(二分+交互)
- CodeForces - 1450E Capitalism(差分约束)
- 牛客 - 膜法记录(状压dp预处理)
- Linux进程详细信息查看
- 离散对数(Baby Step Giant Step)
- Team Work(CF 932 E)[bzoj5093][Lydsy1711月赛]图的价值
- cocos2d-x初探学习笔记(2)--重要概念及Test例子结构
- WinDbg学习笔记(一)--认识WinDbg