前言

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. P4169-CDQ分治/K-D tree(三维偏序)-天使玩偶

    P4169-CDQ分治/K-D tree(三维偏序)-天使玩偶 这是一篇两种做法都有的题解 题外话 我写吐了-- 本着不看题解的原则,没写(不会)K-D tree,就写了个cdq分治的做法.下面是我的 ...

  2. SAS启动时自动执行代码

    有时候我们希望SAS启动时自动执行已经编写好的程序,可以按照以下方法实现: 首先正常打开SAS,编写我们想要让SAS启动时自动执行的代码,例如获取桌面文件夹路径,以便在其他程序中引用这个路径. pro ...

  3. spring Data Rest 远程命令执行漏洞(CVE-2017-8046)

    参考 文章https://blog.csdn.net/weixin_41438728/article/details/110425174 影响版本 Spring Framework 5.0 to 5. ...

  4. GlassFish 任意文件读取漏洞

    poc https://192.168.49.2:4848/theme/META-INF/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0 ...

  5. JSON数据的HTTP Header应该怎么标记?

    第一种 header('Content-type: application/json'); 另一种 header('Content-type: text/json');

  6. 大数据学习(19)—— Flume环境搭建

    系统要求 Java1.8或以上 内存要足够大 硬盘足够大 Agent对源和目的要有读写权限 Flume部署 我这8G内存的电脑之前搭建Hadoop.Hive和HBase已经苟延残喘了,怀疑会卡死,硬着 ...

  7. Java代码中,如何监控Mysql的binlog?

    最近在工作中,遇到了这样一个业务场景,我们需要关注一个业务系统数据库中某几张表的数据,当数据发生新增或修改时,将它同步到另一个业务系统数据库中的表中. 一提到数据库的同步,估计大家第一时间想到的就是基 ...

  8. Android开发失业六个月了,无限的焦虑

    最近到网上看到这样一个帖子: Android开发,坐标魔都:目前为止已经失业六个月,找工作期间,尤其是最近两天确实心态不好.要么没有面试,要么给的工资不符合预期( hr 压价太狠了,原先说的 19k, ...

  9. 关于TreeSet集合的理解

    TreeSet 集合主要是实现了Collection集合的实现类,主要框架为: 1. Set接口的框架: |----Collection接口:单例集合,用来存储一个一个的对象 |----Set接口: ...

  10. rancher v1.6.29部署K8s

    1. 前提:上一文中,已部署好单节点Rancher v1.6.29 2. 在Rancher中,添加环境模板 修改k8s设置参数 参数修改明细: Private Registry for Add-Ons ...