命令

1
go test -bench

参数

1
2
3
4
5
6
# -bench 过滤规则,指定要测试的方法
# -benchtime 测试时间 5s 代表5秒 100x 代表执行次数
# -count 进行3轮测试
# -benchmem 显示内存分配情况
# -cpu 设置cpu核数,默认是处理器核数
go test -bench="xxx" -benchtime=5s/100x -count=3 -benchmem

实例

  • 测试斐波那契数列计算时间
1
2
3
4
5
6
7
// fib.go
func fib(n int64) int64 {
if n == 0 || n == 1 {
return n
}
return fib(n-1) + fib(n-2)
}
1
2
3
4
5
6
// fib_test.go
func BenchmarkFib(b *testing.B) {
for n := 0; n < b.N; n++ {
fib(30)
}
}

测试结果

1
2
3
4
5
6
7
8
9
10
11
12
13
go test -bench="Fib$" //执行以Fib结尾的函数  -benchtime=100x //执行100次  -count=5 // 执行5轮测试

goos: darwin
goarch: amd64
pkg: LearnHub/goroutine
cpu: Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz
BenchmarkFib-4 100 5849887 ns/op
BenchmarkFib-4 100 6260213 ns/op
BenchmarkFib-4 100 6503650 ns/op
BenchmarkFib-4 100 6111853 ns/op
BenchmarkFib-4 100 5989032 ns/op
PASS
ok LearnHub/goroutine 3.122s
  • 测试内存分配次数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// fib.go
// 申请 容量为n的切片
func generateWithCap(n int) []int {
rand.Seed(time.Now().UnixNano())
nums := make([]int, 0, n)
for i := 0; i < n; i++ {
nums = append(nums, rand.Int())
}
return nums
}
// 默认申请0容量的切片,golang会自动扩容
func generate(n int) []int {
rand.Seed(time.Now().UnixNano())
nums := make([]int, 0)
for i := 0; i < n; i++ {
nums = append(nums, rand.Int())
}
return nums
}
1
2
3
4
5
6
7
8
9
10
11
12
// fib_test.go
func BenchmarkGenerate(b *testing.B) {
for n := 0; n < b.N; n++ {
generate(1000000)
}
}

func BenchmarkGenerateWithCap(b *testing.B) {
for n := 0; n < b.N; n++ {
generateWithCap(1000000)
}
}

测试结果

1
2
3
4
5
6
7
8
9
10
go test -bench="Generate" -benchmem

goos: darwin
goarch: amd64
pkg: LearnHub/goroutine
cpu: Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz
BenchmarkGenerate-4 31 34613748 ns/op 41678200 B/op 38 allocs/op
BenchmarkGenerateWithCap-4 46 26274022 ns/op 8003586 B/op 1 allocs/op // 可以看到设置容量的直进行了一次内存分配操作
PASS
ok LearnHub/goroutine 2.356s