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

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

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

基准测试

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

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

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

查看所有标签

猜你喜欢:

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

Bulletproof Web Design

Bulletproof Web Design

Dan Cederholm / New Riders Press / 28 July, 2005 / $39.99

No matter how visually appealing or packed with content a Web site is, it isn't succeeding if it's not reaching the widest possible audience. Designers who get this guide can be assured their Web site......一起来看看 《Bulletproof Web Design》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具