Golang – Benchmark 性能测试
Golang benchmark 是用来测量和评估 Go 语言代码性能的工具。通过编写基准测试,你可以了解代码在不同条件下的执行时间和资源消耗。
- 文件并需要是 xxx_test.go
- function名必须camel case, 而已是BenchMark开头,例如:func BenchmarkTest1()
- 导入的pointer必须使用*testing.B
使用案例:
// 使用+操作符连接字符串
func ConcatWithPlus(a, b string) string {
// 返回两个字符串相加的结果
return a + b
}
// 使用fmt.Sprintf连接字符串
func ConcatWithSprintf(a, b string) string {
// 使用fmt.Sprintf格式化并连接字符串
return fmt.Sprintf("%s%s", a, b)
}
// 基准测试使用+操作符连接字符串
func BenchmarkTest1(b *testing.B) {
// 在b.N次循环中测试ConcatWithPlus函数的性能
for i := 0; i < b.N; i++ {
ConcatWithPlus("Hello", "World")
}
}
// 基准测试使用fmt.Sprintf连接字符串
func BenchmarkTest2(b *testing.B) {
// 在b.N次循环中测试ConcatWithSprintf函数的性能
for i := 0; i < b.N; i++ {
ConcatWithSprintf("Hello", "World")
}
}
运行命令:
go test -bench=. 【点的意思就是当下目录测试所有benchmark的function】
go test -bench=BenchmarkTest1【输入BenchmarkTest1,就是只测试这function】
输出结果:
goos: darwin
goarch: arm64
pkg: test
BenchmarkTest1-8 100000000 10.96 ns/op
BenchmarkTest2-8 14334940 83.95 ns/op
PASS
【结果解释】
BenchmarkMyFunction-8
:基准测试的名称,后缀的数字表示测试时的CPU核心数量。
1000000
:基准测试运行的次数。
2000 ns/op
:每次操作的平均耗时(纳秒)。
【b.N
解释 】
b.N
的次数不是随机的。b.N
是由 Go 的基准测试框架自动确定的一个值,用来确保基准测试的结果具有足够的统计意义。
在运行基准测试时,Go 基准测试框架会多次运行被测试的代码,并根据实际运行时间动态调整 b.N
的值。最初,b.N
的值可能很小(例如 1),然后根据每次运行的时间,逐渐增加 b.N
的值,直到总运行时间足够长,以便能够获得稳定的测量结果。
简而言之,b.N
的值是通过基准测试框架逐渐调整的,以确保测试结果的准确性和可靠性,而不是随机的。
Facebook评论