热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GO随笔单元测试基准测试

基准测试测试不仅要测试逻辑,还有一个很重要的一点是性能。我对其他语言了解不深,我不知道其他语言在测试性能时是怎么做的。但我感觉,gotest在测试性能上绝对是数一数二的便利。写一个

基准测试

测试不仅要测试逻辑,还有一个很重要的一点是性能。
我对其他语言了解不深,我不知道其他语言在测试性能时是怎么做的。但我感觉,go test在测试性能上绝对是数一数二的便利。

写一个基准测试
sort.go

package sort
/**
* 从小到大排序
*/
//冒泡排序
func BubbleSort(a []int) []int{
lenth := len(a)
for i := 0; i for j := i+1; j if a[j] a[j], a[i] = a[i], a[j]
}
}
}
return a
}
//选择排序
func SelectSort(a []int) []int {
lenth := len(a)
var minIndex int
for i := 0; i minIndex = i;
for j := i+1; j if a[j] minIndex = j;
}
}
a[i], a[minIndex] = a[minIndex], a[i]
}
return a
}
//插入排序
func InsertSort(a []int) []int {
lenth := len(a)
for i := 1; i index := i-1
number := a[i]
for index >= 0 && number a[index+1], a[index] = a[index], a[index+1]
index--
}
}
return a
}

sort_test.go

package sort
import (
"testing"
)
var a = []int{6,3,8,1,3,4,8,1,3}
func BenchmarkBubbleSort(b *testing.B) {
for i:=0; i BubbleSort(a)
}
}
func BenchmarkSelectSort(b *testing.B) {
for i:=0; i SelectSort(a)
}
}
func BenchmarkInsertSort(b *testing.B) {
for i:=0; i InsertSort(a)
}
}

执行go test -bench=.
《GO随笔-单元测试-基准测试》

分析上面的过程
在测试性能的时候通常使用testing.B类型。运行go test -bench=.=后是函数名称,支持正则。
基准测试需要遵循以下几点:

  • 基准测试的函数必须以Benchmark开头
  • for循环很重要,测试代码要放在循环里面
  • b.N是基准测试框架提供的,表示循环次数。

其余与基础测试规范基本一致。

要测试一个函数的性能,少不了多次调用。forb.N正是基准测试的核心体现。测试框架将函数循环N次后,将性能平均值反馈给我们。
解释参数:

  1. 函数后面-4,代表了GOMAXPROCS(最大同时使用的CPU核数)。我的电脑是4核,所以默认是-4。如果想设置,在init函数中调用runtime.GOMAXPROCS(1)即可设置代码使用的CPU核数。
  2. 20000000代表执行次数,即b.N。这是框架动态算出来的值。根据我的理解,由于框架在执行函数之前也不知道这个函数的运行时间,所以会先少量的循环几次这个方法,拿到些初步数据,计算出一个大量、结果稳定的数作为循环次数N。
  3. ns/op-nanosecond/operation 即执行一次操作消耗的时间。52.0 ns/op即平均每执行一次操作消耗0.052毫秒。
  4. B/op 平均每次操作需要占用的内存空间(字节)
  5. allocs/op 平均每次操作需要分配内次的次数

还有一些参数我还没有见过。
通过对比明显能够看出插入排序(InsertSort)的效率远高于冒泡排序和选择排序。但除了时间外,很多时候我们更想看到内从的使用情况。通过go test -bench=. -benchmem即可看到:
《GO随笔-单元测试-基准测试》

这次测试结果和上次测试结果相对比有一些差异:

  1. B/op、allocs/op都是0,这是因为

推荐阅读
  • go channel 缓冲区最大限制_Golang学习笔记之并发.协程(Goroutine)、信道(Channel)
    原文作者:学生黄哲来源:简书Go是并发语言,而不是并行语言。一、并发和并行的区别•并发(concurrency)是指一次处理大量事情的能力 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • Annotation的大材小用
    为什么80%的码农都做不了架构师?最近在开发一些通用的excel数据导入的功能,由于涉及到导入的模块很多,所以开发了一个比较通用的e ... [详细]
  • 按照之前我对map的理解,map中的数据应该是有序二叉树的存储顺序,正常的遍历也应该是有序的遍历和输出,但实际试了一下,却发现并非如此,网上查了下,发现从Go1开始,遍历的起始节点就是随机了,当然随机 ... [详细]
  • golang 解析磁力链为 torrent 相关的信息
    其实通过http请求已经获得了种子的信息了,但是传播存储种子好像是违法的,所以就存储些描述信息吧。之前python跑的太慢了。这个go并发不知道写的有没有问题?!packag ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 本文讨论了在dva中引入antd组件table时没有显示样式的问题。提供了.roadhogrc文件的配置,包括环境和import的设置。同时介绍了extraBabelPlugins和transform-runtime的使用方法,并解释了libraryName和css的含义。 ... [详细]
  • golang字符串转Time类型问题小记
      最近在做项目中,遇到了golang字符串转Time类型的问题。调研后发现golang提供了俩种方式,即time.Parse跟time.ParseInLocation。俩种方式差 ... [详细]
author-avatar
淡淡笑嘻嘻
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有