go 基准测试初体验
基准测试(Benchmark)是Go语言中用于衡量代码性能的重要工具。通过编写基准测试函数,并使用testing.B提供的方法来记录执行时间和其他指标,我们可以准确地评估代码的性能表现。在开发过程中,合理使用基准测试可以帮助我们优化代码,提升程序的性能。本文将详细介绍Go的基准测试的基础用法,并通过案例说明如何编写和运行基准测试。
一、基准测试的概念
基准测试是一种用于衡量代码性能的测试方法。它通过多次运行同一个函数或代码块,并统计执行时间和内存消耗等指标,来评估代码的性能表现。
二、编写一个基准测试代码
package main
import (
"testing"
)
func Fibonacci(n int) int {
if n <= 1 {
return n
}
return Fibonacci(n-1) + Fibonacci(n-2)
}
func BenchmarkFibonacci(b *testing.B) {
for i := 0; i < b.N; i++ {
Fibonacci(20)
}
}
上面是一个典型的基准测试代码,我们定义了Fibonacci函数用于计算斐波那契数列。然后,我们编写了BenchmarkFibonacci函数作为基准测试函数。执行go test -bench=.得到如下结果
goos: darwin
goarch: arm64
pkg: test/man
BenchmarkFibonacci-8 49478 22266 ns/op
PASS
ok test2/man/test 2.048s
三、解读测试结果
在上面的示例代码中,我们得到了基准测试的结果,现在我们就这个来做一个基础的解读。
goos
操作系统goarch
CPU架构pkg
包名BenchmarkFibonacci-8 49478 22266 ns/op
8
个cpu并行执行,平均执行一次需要22266
纳秒,1秒之内可运行49478
次PASS
表示所有的测试用例都通过了,没有发现错误。这意味着您的代码在测试过程中没有引发任何失败或错误。ok
表示测试通过,没有发现错误。在基准测试结果中,通常会显示"ok",这是因为基准测试不会产生失败或错误的结果,只会提供性能指标2.048s
运行所有基准测试的总时间为2.149秒
这个基准测试的结果解读已经完成,我们可以根据该结果进行代码性能的评估和优化。当然,go基准测试还有丰富的参数可以选择,可以得到的信息也不止示例中显示的内容,后续的文章中,会一步一步详细介绍和解读。
四、注意事项
- 测试文件
基准测试代码文件必须是
XXX_test.go
结尾,通常XXX
与对应的正式代码文件名称相同,但不是强制性的要求 - 函数签名
基准测试函数的命名必须以
Benchmark
开头,并接收一个*testing.B
类型的参数。例如:
func BenchmarkMyFunction(b *testing.B)
- 循环执行
基准测试函数中,我们需要使用
b.N
来指定要运行的次数。Go会根据系统情况生成,不用用户设定,循环体内的代码将会被执行b.N
次,以获取准确的性能数据。
高性能Golang编程 文章被收录于专栏
galang各种高性能编码姿势一网打尽!