GO随笔-单元测试-基准测试

栏目: 编程工具 · 发布时间: 6年前

内容简介:测试不仅要测试逻辑,还有一个很重要的一点是性能。我对其他语言了解不深,我不知道其他语言在测试性能时是怎么做的。但我感觉,写一个基准测试

基准测试

测试不仅要测试逻辑,还有一个很重要的一点是性能。

我对其他语言了解不深,我不知道其他语言在测试性能时是怎么做的。但我感觉, 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=.
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,这是因为

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Pro Git

Pro Git

Scott Chacon / Apress / 2009-8-27 / USD 34.99

Git is the version control system developed by Linus Torvalds for Linux kernel development. It took the open source world by storm since its inception in 2005, and is used by small development shops a......一起来看看 《Pro Git》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

html转js在线工具
html转js在线工具

html转js在线工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换