前言

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测试--性能测试分析的更多相关文章

  1. loadrunner测试结果分析

    LR性能测试结果样例分析 测试结果分析 LoadRunner性能测试结果分析是个复杂的过程,通常可以从结果摘要.并发数.平均事务响应时间.每秒点击数.业务成功率.系统资源.网页细分图.Web服务器资源 ...

  2. Monkey测试结果分析

    Monkey测试结果分析 什么是monkey Monkey 测试是 Android 自动化测试的手段之一,它通过模拟用户的按键输入.触摸屏输入等,测试设备多长时间出现异常.Monkey 是一个命令行工 ...

  3. 测试计划&性能测试分析报告模板(仅供参考)

    一.测试计划 1. 引言 1.1  编写目的 2. 参考文档 3. 测试目的 4. 测试范围 4.1  测试对象 4.2  需要测试的特性 4.3  无需测试的特性 5. 测试启动与结束准则 5.1  ...

  4. Visual Studio性能计数器,负载测试结果分析- Part III

    对于一个多用户的应用程序,性能是非常重要的.性能不仅是执行的速度,它包括负载和并发方面.Visual Studio是可以用于性能测试的工具之一.Visual Studio Test版或Visual S ...

  5. 【转】Jmeter测试结果分析

    Jmeter测试结果分析这一篇,我打算分成上下两部分.上篇,主要讲述如何使用jmeter中Assertion对结果进行简单的分类:下篇,主要讲述的是当我们拿到测试结果后,我们应该如何去看待这些测试结果 ...

  6. LR性能测试分析流程

    LR性能测试分析流程 一.     判断测试结果的有效性 (1)在整个测试场景的执行过程中,测试环境是否正常. (2)测试场景的设置是否正确.合理. (3)测试结果是否直接暴露出系统的一些问题. (4 ...

  7. Jmeter测试结果分析(下)

    Jmeter测试结果分析(下) 前文再续,续接上一回.上一篇讲了如何利用Assertion将测试结果进行初步的筛选.那么,当我们拿到了测试结果之后,我们应该如何去看待它们呢?它们又是怎么来的呢? 一. ...

  8. Jmeter- 笔记12 - 性能测试分析 & 性能测试流程

    性能测试分析 场景设计.监视图表: 设计场景:阶梯式.波浪式 监视器: 收集用于性能分析的数据:TPS图表.聚合报告\汇总报告.察看结果树.响应时间.吞吐量 服务器资源监控:cpu.内存.磁盘io 分 ...

  9. LoadRunner测试结果分析03 转载至zhangzhe的新浪博客

    LoadRunner测试结果分析之我见 前面分析的Web Resource(网络资源)的测试情况,其主要关注的是服务器性能,而系统本身和环境都有可能存在问题,页面诊断(Web Page Diagnos ...

随机推荐

  1. Apache HBase 1.7.1 发布,分布式数据库

    Apache HBase 是一个开源的.分布式的.版本化的.非关系的数据库.Apache HBase 提供对数十亿个数据的低延迟随机访问在非专用硬件上有数百万列的行. 关于 HBase更多内容,请参阅 ...

  2. VScode中LeetCode插件无法登录的情况

    VScode中LeetCode插件无法登录的情况 一直提示账户和密码无效,不知道什么问题. 后来发现是设置问题 在插件中找到leetcode 右键,点击setting 在界面里找到这里,将leetco ...

  3. 【Javaweb】Cookie和Session

    会话技术 什么是会话 从浏览器访问服务器开始,到访问服务器结束,浏览器关闭为止的这段时间内容产生的多次请求和响应,合起来叫做浏览器和服务器之间的一次会话 会话管理作用 共享数据用的,并且是在不同请求间 ...

  4. 第1天 Mark Down 学习及DOS命令

    Markdown学习 标题 "#加空格"几个#就表示几级标题 字体 helloworld!一两个两个*号 helloworld!一边一个*号 helloworld! 一边三个号 h ...

  5. 第十一篇 -- 如何实现MFC窗口的最大化以及控件随最大化

    这一篇介绍的是怎么实现MFC窗口的最大最小化,以及里面控件大小也随之改变 第一步:实现窗口最大最小化 首先右击窗口空白处,打开properties,将里面的MaximizeBox和MinimizeBo ...

  6. shell脚本(12)-特殊变量介绍

    一.特殊变量介绍: 1.$* :代表所有参数,其间隔为IFS内参数的第一个字元 2.$@ :与*星号类同,不同之处在于不参照IFS 3.$# :代表参数数量 4.$: 代表上一个指令的返回值 5.$- ...

  7. vsCode开发flutter项目

    Visual Studio Code 安装: 下载链接:https://code.visualstudio.com/ 下载完成后根据步骤自行安装.     使用vsCode开发flutter项目需要部 ...

  8. videojs文档翻译-EventTarget

    EventTarget new EventTarget()   EventTarget是一个可以与DOM EventTarget具有相同API的类. 它增加了包含冗长功能的缩写功能. 例如:on函数是 ...

  9. Java学习常用链接

    最全的Jenkins插件开发教程 最最最全的Jenkins插件开发教程_邪恶八进制-CSDN博客_jenkins插件开发 代理FQ工具Shadow socks https://www.blog-chi ...

  10. Hadoop 3.1.1 - Yarn 服务 - 总览

    YARN 服务 总览 Yarn 服务框架为在 Yarn 原生环境里长时间运行的服务,提供了一流的支持和接口.简言之,它扮演了容器编排系统的角色,统一管理 Yarn 上运行的容器化服务.它同时支持 Do ...