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=.=後是函數名稱,支持正則。
基準測試須要遵循如下幾點:spa

  • 基準測試的函數必須以Benchmark開頭
  • for循環很重要,測試代碼要放在循環裏面
  • b.N是基準測試框架提供的,表示循環次數。

其他與基礎測試規範基本一致。code


要測試一個函數的性能,少不了屢次調用。forb.N正是基準測試的核心體現。測試框架將函數循環N次後,將性能平均值反饋給咱們。
解釋參數:blog

  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便可看到:
圖片描述排序

此次測試結果和上次測試結果相對比有一些差別:圖片

  1. B/op、allocs/op都是0,這是由於
相關文章
相關標籤/搜索