测试不只要测试逻辑,还有一个很重要的一点是性能。
我对其余语言了解不深,我不知道其余语言在测试性能时是怎么作的。但我感受,go test
在测试性能上绝对是首屈一指的便利。框架
写一个基准测试
sort.go函数
package sort /** * 从小到大排序 */ //冒泡排序 func BubbleSort(a []int) []int{ lenth := len(a) for i := 0; i < lenth; i++{ for j := i+1; j < lenth; j++ { if a[j]<a[i] { 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 < lenth; i++ { minIndex = i; for j := i+1; j < lenth; j++ { if a[j] < a[minIndex] { minIndex = j; } } a[i], a[minIndex] = a[minIndex], a[i] } return a } //插入排序 func InsertSort(a []int) []int { lenth := len(a) for i := 1; i < lenth; i++{ index := i-1 number := a[i] for index >= 0 && number<a[index] { 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<b.N; i++{ BubbleSort(a) } } func BenchmarkSelectSort(b *testing.B) { for i:=0; i<b.N; i++{ SelectSort(a) } } func BenchmarkInsertSort(b *testing.B) { for i:=0; i<b.N; i++{ InsertSort(a) } }
执行go test -bench=.
测试
分析上面的过程
在测试性能的时候一般使用testing.B类型。运行go test -bench=.
,=
后是函数名称,支持正则。
基准测试须要遵循如下几点:spa
其他与基础测试规范基本一致。code
要测试一个函数的性能,少不了屡次调用。for
和b.N
正是基准测试的核心体现。测试框架将函数循环N次后,将性能平均值反馈给咱们。
解释参数:blog
-4
,表明了GOMAXPROCS(最大同时使用的CPU核数)。个人电脑是4核,因此默认是-4
。若是想设置,在init
函数中调用runtime.GOMAXPROCS(1)
便可设置代码使用的CPU核数。20000000
表明执行次数,即b.N。这是框架动态算出来的值。根据个人理解,因为框架在执行函数以前也不知道这个函数的运行时间,因此会先少许的循环几回这个方法,拿到些初步数据,计算出一个大量、结果稳定的数做为循环次数N。ns/op
-nanosecond/operation 即执行一次操做消耗的时间。52.0 ns/op即平均每执行一次操做消耗0.052毫秒。B/op
平均每次操做须要占用的内存空间(字节)allocs/op
平均每次操做须要分配内次的次数还有一些参数我尚未见过。
经过对比明显可以看出插入排序(InsertSort)的效率远高于冒泡排序和选择排序。但除了时间外,不少时候咱们更想看到内从的使用状况。经过go test -bench=. -benchmem
便可看到:排序
此次测试结果和上次测试结果相对比有一些差别:图片