Go语言标准库内置的 testing 测试框架提供了基准测试(benchmark)的能力,实现了对某个特定目标场景的某项性能指标进行定量的和可对比的测试。
基本规则
常用命令
$ go test -bench=. -benchmem
-bench=.
标记,它接受一个表达式作为参数,匹配基准测试的函数,.
表示运行所有基准测试。-benchmem
提供每次操作分配内存的次数,以及每次操作分配的字节数。-run=none
匹配单元测试方法,这里使用 none
是因为没有这个名字的单元测试方法,等效于过滤掉单元测试的输出。-benchtime=3s
指定测试的时间,例如3秒,测试时间默认是1秒。-count=3
用来设置 benchmark 的轮数。例如,进行3轮benchmark。举个栗子
评估1000个字符串的连接性能,分别使用 +
操作符、bytes.Buffer
和strings.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.Buffer
和strings.Builder
比 +
操作符 更快。
参考文章
原文:https://www.cnblogs.com/marszuo/p/15222552.html