简介
基准测试是一种测试代码性能的方法, 同时也可以用来识别某段代码的CPU或者内存效率问题. 许多开发人员会用基准测试来测试不同的并发模式, 或者用基准测试来辅助配置工作池的数量, 以保证能最大化系统的吞吐量.
和单元测试的文件名一样, 基准测试的文件名也必须以“_test.go”结尾. 另外, 基准测试函数必须以Benchmark开头, 接受一个指向testing.B类型的指针作为唯一参数.
实战
题目:比较Golang标准库里3种将整数转为字符串的性能。
package benchmark_test
import (
"fmt"
"strconv"
"testing"
)
func BenchmarkSprintf(b *testing.B) {
b.ResetTimer()
number := int64(10)
for i := 0; i < b.N; i++ {
fmt.Sprintf("%d", number)
}
}
func BenchmarkItoa(b *testing.B) {
b.ResetTimer()
number := 10
for i := 0; i < b.N; i++ {
strconv.Itoa(number)
}
}
func BenchmarkFormat(b *testing.B) {
b.ResetTimer()
number := int64(10)
for i := 0; i < b.N; i++ {
strconv.FormatInt(number, 10)
}
}
运行结果:
从运行结果看, sprintf执行了5kw次, 平均一次要105ns; itoa执行了10亿次, 平均一次要5.64ns, formatInt执行了20亿次, 平均每次要3.73ns.
参数介绍:
-bench=. 表示希望运行所有的基准测试函数, 也可以指定基准测试名字, 如-bench="BenchmarkFormat", 并且支持表达式;
-benchtime="3s" 表示每个基准测试函数持续3s;
-benchmem提供每次操作分配内存的次数(如2 allocs/op), 以及每次操作分配的字节数(16B/op).