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 ...
随机推荐
- eladmin-plus V2.0.0 发布,单表链式调用更丝滑
一.项目简介 eladmin的mybatis-plus版本,单表使用链式调用,代码更简洁,调用更便捷.目前更新到2021年7月.项目基于 Spring Boot 2.4.2 . Mybatis-plu ...
- 简明易懂,将细节隐藏,面向新手树立web开发概念——学完Java基础语法,超快速上手springboot+mybatiJavaWeb开发
简明易懂,将细节隐藏,面向新手树立web开发概念 --学完Java基础语法,超快速上手JavaWeb开发 Web本质(先忽视各种协议) Web应用可以理解为浏览器和服务器之间的交互. 我们可以看一个简 ...
- Centos LInux 7.0 内核3.1 升级简化流程
Centos LInux 7.0 内核3.1 升级建华流程 1)#导入ELRepo软件仓库的公共秘钥rpm --import https://www.elrepo.org/RPM-GPG-KEY-el ...
- UI_UE在线就业-笔记
UI设计 一.字体设计的应用范围 Logo设计.平面海报.包装设计.banner设计.APP引导页.UI图标.UI界面.影视设计 二.字体的分类 衬线字体和非衬线字体之分 区别在于笔画开始与结尾地方有 ...
- CSS实现隐藏滚动条并可以滚动内容
方法一: 计算滚动条宽度并隐藏起来,其实我只是把滚动条通过定位把它隐藏了起来,下面给一个简化版的代码: <div class="outer-container"> &l ...
- 我一个五年Android开发,居然被一个技术不如我的面试官嫌弃了......
背景 首先介绍一下自己的情况.目前所在的是一家小的创业公司,待了5年多,薪资一般吧.由于这几年公司也在转型.工作经历大概可以分为 3 个阶段. 第一阶段是从进公司开始做 android app 开发, ...
- CentOS帮助类语法
目录 一.man获取帮助信息 二.help获得shell内置命令的帮助信息 三.history查看所有命令历史 补充:Linux常用快捷键 一.man获取帮助信息 基本语法:man [命令或配置文件] ...
- 第6篇-Java方法新栈帧的创建
在 第2篇-JVM虚拟机这样来调用Java主类的main()方法 介绍JavaCalls::call_helper()函数的实现时提到过如下一句代码: address entry_point = me ...
- 面试官:实现一个带值变更通知能力的Dictionary
如题, 你知道字典KEY对应的Value什么时候被覆盖了吗?今天我们聊这个刚性需求. 前文提要: 数据获取组件维护了业务方所有(在用)的连接对象,DBA能在后台无侵入的切换备份库. 上文中:DBA在为 ...
- 深入了解jvm-2Edition-虚拟机字节码执行引擎
1.概述 Java虚拟机规范制定了虚拟机字节码执行引擎的概念模型,本章主要从概念模型层次来探究虚拟机的方法调用和字节码执行. 方法调用中,最核心的,是如何确定调用的方法,也就是方法的分派. 字节码执行 ...