基准测试
Go语言标准库内置的 testing 测试框架提供了基准测试(benchmark)的能力,实现了对某个特定目标场景的某项性能指标进行定量的和可对比的测试。
基本规则
- 基准测试的代码文件必须以_test.go结尾
- 基准测试的函数必须以Benchmark开头,必须是可导出的
- 基准测试函数必须接受一个指向Benchmark类型的指针作为唯一参数
- b.ResetTimer是重置计时器,这样可以避免for循环之前的初始化代码的干扰
- 最后的for循环很重要,被测试的代码要放到循环里
- b.N是基准测试框架提供的,表示循环的次数,因为需要反复调用测试的代码,才可以评估性能
常用命令
$ go test -bench=. -benchmem
-bench=..-benchmem-run=nonenone-benchtime=3s-count=3
举个栗子
+bytes.Bufferstrings.Builder
package main
import (
"bytes"
"strings"
"testing"
)
var strLen = 1000
func BenchmarkConcatString(b *testing.B) {
var str string
i := 0
b.ResetTimer()
for n := 0; n < b.N; n++ {
str += "x"
i++
if i >= strLen {
i = 0
str = ""
}
}
}
func BenchmarkConcatBuffer(b *testing.B) {
var buffer bytes.Buffer
i := 0
b.ResetTimer()
for n := 0; n < b.N; n++ {
buffer.WriteString("x")
i++
if i >= strLen {
i = 0
buffer = bytes.Buffer{}
}
}
}
go test -bench=. -benchmem
$ go test -bench=^BenchmarkConcat -benchmem
goos: darwin
goarch: amd64
pkg: go_learning_notes/benchmark
cpu: Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz
BenchmarkConcatString-4 8040235 140.5 ns/op 530 B/op 0 allocs/op
BenchmarkConcatBuffer-4 168521010 6.384 ns/op 2 B/op 0 allocs/op
BenchmarkConcatBuilder-4 464368256 2.475 ns/op 2 B/op 0 allocs/op
PASS
ok go_learning_notes/benchmark 5.035s
bytes.Bufferstrings.Builder+
参考文章