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