Skip to content

基准测试

  • 用于衡量代码性能的重要工具,通过 testing 包实现。
  • 它可以帮助你分析代码的执行效率,找出性能瓶颈。

基本规则

  • 新建一个test目录,包含所有测试用例
  • 创建一个测试文件,文件名格式必须xxx_test.go
  • 测试函数必须BenchmarkXxx开头
  • 测试函数必须接收一个指向 b testing.B 的指针作为参数

代码示例

go
package curl

import (
	"testing"
)

// Fib 计算第 n 个斐波那契数
func Fib(n int) int {
    if n <= 1 {
        return n
    }
    return Fib(n-1) + Fib(n-2)
}

// 基准测试:测试 Fib(10) 的性能
func BenchmarkFib10(b *testing.B) {
    // 循环 b.N 次,每次执行被测试函数
    for i := 0; i < b.N; i++ {
        Fib(10)
    }
}

// 基准测试:测试 Fib(20) 的性能
func BenchmarkFib20(b *testing.B) {
	for i := 0; i < b.N; i++ {
		Fib(20)
	}
}

运行测试

参数说明

  • -bench 指定要运行的基准测试函数。
  • -benchmem 额外输出内存分配统计(分配次数和字节数)
  • -benchtime 指定基准测试的运行时间,默认是 1 秒。
bash
# 运行所有基准测试
go test -bench=.

# 运行指定基准测试函数
go test -bench="BenchmarkFib10|BenchmarkFib20"

# 额外分配内存
go test -bench="BenchmarkFib10|BenchmarkFib20" -benchmem

# 运行基准测试 10 秒
go test -bench="BenchmarkFib10|BenchmarkFib20" -benchtime=10s

结果分析

bash
goos: darwin
goarch: arm64
BenchmarkFib10-12       10703092             106.7 ns/op               0 B/op          0 allocs/op
BenchmarkFib20-12          91834             13298 ns/op               0 B/op          0 allocs/op
PASS
  • BenchmarkFib10-12 表示在 12个 CPU 核心上运行 BenchmarkFib10 基准测试函数。
  • 10703092 b.N 的最终值(循环执行了 10703092 次)。
  • 106.7 ns/op 表示每次调用 Fib(10) 函数平均需要 106.7 纳秒。
  • 0 B/op 表示每次调用 Fib(10) 函数分配的内存字节数。
  • 0 allocs/op 表示每次调用 Fib(10) 函数分配的内存次数。