Go测试--性能测试分析
前言
benchmark测试是实际项目中经常使用的性能测试方法,我们可以针对某个函数或者某个功能点增加benchmark测试,
以便在CI测试中监测其性能变化,当该函数或功能性能下降时能够及时发现。
此外,在日常开发活动中或者参与开源贡献时也有可能针对某个函数或功能点做一些性能优化,此时,如何把benchmark测试数据呈现出来便非常重要了,因为你很可能在优化前后执行多次benchmark测试,手工分析这些测试结果无疑是低效的。
认识数据
先看一个benchmark的样本:
BenchmarkReadGoSum-4           2223        521556 ns/op
其中
- 测试名字BenchmarkReadGoSum-4(其中-4表示测试环境为4个cpu)
 - 测试迭代次数(2223)
 - 每次迭代的花费的时间(521556ns)。
 
尽管每个样本中的时间已经是多次迭代后的平均值,但为了更好的分析性能,往往需要多个样本。
使用go test的-count=N参数可以指定执行benchmarkN次,从而产生N个样本,比如产生15个样:
BenchmarkReadGoSum-4           2223        521556 ns/op
BenchmarkReadGoSum-4           2347        516675 ns/op
BenchmarkReadGoSum-4           2340        538406 ns/op
BenchmarkReadGoSum-4           2130        548440 ns/op
BenchmarkReadGoSum-4           2391        514602 ns/op
BenchmarkReadGoSum-4           2394        527955 ns/op
BenchmarkReadGoSum-4           2313        536693 ns/op
BenchmarkReadGoSum-4           2330        538244 ns/op
BenchmarkReadGoSum-4           2360        516426 ns/op
BenchmarkReadGoSum-4           2407        541435 ns/op
BenchmarkReadGoSum-4           2154        544386 ns/op
BenchmarkReadGoSum-4           2362        540411 ns/op
BenchmarkReadGoSum-4           2305        581713 ns/op
BenchmarkReadGoSum-4           2204        519633 ns/op
BenchmarkReadGoSum-4           1867        602543 ns/op
手工分析多个样本将会是一项非常有挑战的工作,因为你可能需要根据统计学规则除去一些异常的样本, 剩下的样本再去平均值。
benchstat
benchstat为Golang官方推荐的一款命令行工具,可以针对一组或多组样本进行分析,如果同时分析两组样本(比如优化前和优化后),还可以给出性能变化结果。
使用命令go get golang.org/x/perf/cmd/benchstat即可快捷安装,它将被安装到$GOPATH/bin目录中。通常我们会将该目录添加到PATH环境变量中。
使用时我们需要把benchmark测试样子输出到文件中,benchstat会读取这些文件,命令格式如下:
benchstat [options] old.txt [new.txt] [more.txt ...]
分析一组样本
我们把上面的15组样本输出到名为BenchmarkReadGoSum.before的文件, 然后使用benchstat分析:
$  benchstat BenchmarkReadGoSum.before
name         time/op
ReadGoSum-4  531µs ± 3%
输出结果包括一个耗时平均值(531µs)和样本离散值(3%)。
分析两组样本
同上,把性能优化后的结果输出到名为BenchmarkReadGoSum.after的文件,然后使用benchstat分析优化的效果:
$ benchstat BenchmarkReadGoSum.before BenchmarkReadGoSum.after
name         old time/op  new time/op  delta
ReadGoSum-4   531µs ± 3%   518µs ± 7%  -2.41%  (p=0.033 n=13+15)
当只有两组样本时,benchstat还会额外计算出差值,比如本例中,平均花费时间下降了2.41%。
另外,p=0.033表示结果的可信程度,p 值越大可信程度越低,统计学中通常把p=0.05作为临界值,超过此值说明结果不可信,可能是样本过少等原因。
n=13+15表示采用的样本数量,出于某些原因(比如数据值反常,过大或过小),benchstat会舍弃某些样本,本例中优化前的数据中舍弃了两个样本,优化后的数据没有舍弃,所以13+15,表示两组样本分别采用了13和15个样本。
小结
在Golang贡献者指导文档中,特别提到如果提交的代码涉及性能变化,需要将benchstat结果上传,以便代码审核者查看。
当然,我们也可以在闭源项目中使用,比起手工分析样本,benchstat明显可以大大提升效率。
Go测试--性能测试分析的更多相关文章
- loadrunner测试结果分析
		
LR性能测试结果样例分析 测试结果分析 LoadRunner性能测试结果分析是个复杂的过程,通常可以从结果摘要.并发数.平均事务响应时间.每秒点击数.业务成功率.系统资源.网页细分图.Web服务器资源 ...
 - Monkey测试结果分析
		
Monkey测试结果分析 什么是monkey Monkey 测试是 Android 自动化测试的手段之一,它通过模拟用户的按键输入.触摸屏输入等,测试设备多长时间出现异常.Monkey 是一个命令行工 ...
 - 测试计划&性能测试分析报告模板(仅供参考)
		
一.测试计划 1. 引言 1.1 编写目的 2. 参考文档 3. 测试目的 4. 测试范围 4.1 测试对象 4.2 需要测试的特性 4.3 无需测试的特性 5. 测试启动与结束准则 5.1 ...
 - Visual Studio性能计数器,负载测试结果分析- Part III
		
对于一个多用户的应用程序,性能是非常重要的.性能不仅是执行的速度,它包括负载和并发方面.Visual Studio是可以用于性能测试的工具之一.Visual Studio Test版或Visual S ...
 - 【转】Jmeter测试结果分析
		
Jmeter测试结果分析这一篇,我打算分成上下两部分.上篇,主要讲述如何使用jmeter中Assertion对结果进行简单的分类:下篇,主要讲述的是当我们拿到测试结果后,我们应该如何去看待这些测试结果 ...
 - LR性能测试分析流程
		
LR性能测试分析流程 一. 判断测试结果的有效性 (1)在整个测试场景的执行过程中,测试环境是否正常. (2)测试场景的设置是否正确.合理. (3)测试结果是否直接暴露出系统的一些问题. (4 ...
 - Jmeter测试结果分析(下)
		
Jmeter测试结果分析(下) 前文再续,续接上一回.上一篇讲了如何利用Assertion将测试结果进行初步的筛选.那么,当我们拿到了测试结果之后,我们应该如何去看待它们呢?它们又是怎么来的呢? 一. ...
 - Jmeter- 笔记12 - 性能测试分析 & 性能测试流程
		
性能测试分析 场景设计.监视图表: 设计场景:阶梯式.波浪式 监视器: 收集用于性能分析的数据:TPS图表.聚合报告\汇总报告.察看结果树.响应时间.吞吐量 服务器资源监控:cpu.内存.磁盘io 分 ...
 - LoadRunner测试结果分析03 转载至zhangzhe的新浪博客
		
LoadRunner测试结果分析之我见 前面分析的Web Resource(网络资源)的测试情况,其主要关注的是服务器性能,而系统本身和环境都有可能存在问题,页面诊断(Web Page Diagnos ...
 
随机推荐
- Linux文件浏览(less、more、head、tail)以及vim编辑器命令总结
			
结合小编学习实践,整理了Linux下查看内容(less.more.head.tail)和编辑内容(vim)的部分基础命令解析: 1.less命令 分页浏览内容,如果在shell命令行下按回车键,则一点 ...
 - spring boot+mybatis plus出现Invalid bound statement (not found)
			
qlSessionFactory不要使用原生的,请使用MybatisSqlSessionFactory
 - python算法学习--待续
			
几个算法网站 算法可视化网站:https://visualgo.net/en,通过动画展示算法实现过程 程序可视化网站:http://www.pythontutor.com/visualize.htm ...
 - 第一篇 -- Jmeter的安装下载
			
参考链接:https://blog.csdn.net/wust_lh/article/details/86095924 本篇介绍的是在Windows下安装Jmeter. 一.下载Jmeter 官网下载 ...
 - 第三篇 -- HTML基础
			
买的课程学习 Web 前端标准 web前端技术指的不是某一项技术,而是一系列技术的集合,主要包括: html -- 结构标准:负责网页结构的搭建 css -- 样式标准/表现标准:负责网页的美化工作 ...
 - Python -- raw_input函数
			
使用raw_input函数,它会把所有的输入当作原始数据(raw data),然后将其放入字符串中: >>> input("Enter a number: ") ...
 - (Opencv06)绘制轮廓函数
			
(Opencv06)绘制轮廓函数 cv2.drawContours(image, contours, contourIdx, color, thickness) img: 指在哪副图像上绘制轮廓 会改 ...
 - Java类的生命周期浅析
			
类的生命周期?对象的生命周期?Spring bean 的生命周期?很多同学可能在学习java基础知识之初,很容易把这几个搞混.本文先来说说Java类的生命周期. 目录 知识前提 类的生命周期 加载(L ...
 - 快速上手 Rook,入门云原生存储编排
			
Rook 是一个开源 cloud-native storage orchestrator(云原生存储编排器),为各种存储解决方案提供平台.框架和支持,以与云原生环境进行原生集成. Rook 将存储软件 ...
 - 01_安装电脑软件的步骤批处理脚本.bat
			
REM 01_安装电脑软件的步骤批处理脚本.bat MD 01_安装电脑软件的步骤 REM ZIP解压密码空格MD 02_制作杏雨梨云USB维护系统2019中秋版之国庆更新固态U盘MD 03_复制安装 ...