GO随笔-单元测试-基准测试
基准测试
测试不仅要测试逻辑,还有一个很重要的一点是性能。
我对其他语言了解不深,我不知道其他语言在测试性能时是怎么做的。但我感觉,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=.,=后是函数名称,支持正则。
基准测试需要遵循以下几点:
- 基准测试的函数必须以Benchmark开头
- for循环很重要,测试代码要放在循环里面
- b.N是基准测试框架提供的,表示循环次数。
其余与基础测试规范基本一致。
要测试一个函数的性能,少不了多次调用。for和b.N正是基准测试的核心体现。测试框架将函数循环N次后,将性能平均值反馈给我们。
解释参数:
- 函数后面-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即可看到:
这次测试结果和上次测试结果相对比有一些差异:
- B/op、allocs/op都是0,这是因为
相关推荐
  woxxoole    2020-02-02  
   lightlanguage    2020-01-13  
   hongsheyoumo    2013-07-28  
   xxzz    2019-12-23  
   Henryztong    2019-11-20  
   王艺强    2019-11-17  
   xuefeng0    2019-10-10  
   周嘉笙    2019-10-09  
   老道长的测试生活    2019-09-03  
   today0    2017-06-08  
   insularisland    2012-08-08  
   风韵雪ForCSDN    2018-01-15  
   GMCWXH    2013-01-06  
   加油奋斗吧    2013-06-02  
   xiyf0    2011-11-18  
   郑文强    2010-12-18  
   xiewanchen00    2010-09-29  
   mohanzb    2010-02-08  
 