go 测试代码性能实例

 

 测试用例

test.go

package test

// MakeSliceWithPreAlloc 不预分配
func MakeSliceWithoutAlloc() []int {
    var newSlice []int

    for i := 0; i < 100000; i++ {
        newSlice = append(newSlice, i)
    }

    return newSlice
}

// MakeSliceWithPreAlloc 通过预分配Slice的存储空间构造
func MakeSliceWithPreAlloc() []int {
    var newSlice []int

    newSlice = make([]int, 0, 100000)
    for i := 0; i < 100000; i++ {
        newSlice = append(newSlice, i)
    }

    return newSlice
}

test_test.go

package test_test
import (
    "test/test"
    "testing"
)

func BenchmarkMakeSliceWithoutAlloc(b *testing.B) {
    for i := 0; i < b.N; i++ {
        test.MakeSliceWithoutAlloc()
    }
}

func BenchmarkMakeSliceWithPreAlloc(b *testing.B) {
    for i := 0; i < b.N; i++ {
        test.MakeSliceWithPreAlloc()
    }
}

测试结果

 

 

 

其中-bench为go test的flag,该flag指示go test进行性能测试,即执行测试文件中符合”BenchmarkXxx”规则的方法。
紧跟flag的为flag的参数,本例表示执行当前所有的性能测试。

通过输出可以直观的看出,BenchmarkMakeSliceWithoutAlloc执行了2000次,平均每次526064纳秒,BenchmarkMakeSliceWithPreAlloc执行了9000次,平均每次119788纳秒。

从测试结果上看,虽然构造切片很快,但通过给切片预分配内存,性能还可以进一步提升,符合预期。关于原理分析,请参考Slice相关章节。

 

 参考:性能测试 http://www.topgoer.cn/docs/gozhuanjia/chapter077.1.2-benchmark_test

 

posted on 2021-05-31 18:10  kevin_yang123  阅读(149)  评论(0编辑  收藏  举报