Golang – Benchmark 性能测试

Golang benchmark 是用来测量和评估 Go 语言代码性能的工具。通过编写基准测试,你可以了解代码在不同条件下的执行时间和资源消耗。

  1. 文件并需要是 xxx_test.go
  2. function名必须camel case, 而已是BenchMark开头,例如:func BenchmarkTest1()
  3. 导入的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 的值是通过基准测试框架逐渐调整的,以确保测试结果的准确性和可靠性,而不是随机的。

Loading

Facebook评论