Go函数性能分析

Go函数性能分析

go官方提供了优秀的函数性能测试工具:benchmark,让我们可以更简单的分析某一段代码的执行效率。

当我们需要分析同一个功能实现的两段不同代码哪个执行效率更高时,benchmark便是一个优秀的脚手架。

  • benchmark测试 和 Test测试有啥区别?

    相同点:

    • 都位与 "_test.go" 后缀的源码内

    不同点:

    • benchmark测试更多是为了测试函数的执行效率、内存分配情况(大小、次数)
    • benchmark测试以函数名 Benchmark 开头, test测试以函数 Test 开头
    • benchmark测试入参为 b *testing.B, test测试入参为 t *testing.T
  • benchmark测试怎么运行?
    • go test 默认不运行 benchmark测试用例, 需要添加 -bench 才能运行 benchmark测试用例。
    • -bench= 可以传入正则表达式,这样匹配的用例才会执行。
    • -cpu 可以改变 GOMAXPROCS, 变更运行的cpu核数
    • -benchtime 可指定执行时间或具体次数
    • -count 可设置 benchmark 轮数
    • -benchmem 可查看内存分配量和分配次数
  • benchmark测试需要尽量保证对比函数的环境稳定和一致,但如果两个函数需要初始化的上下文不一样,而我们只关心核心处理代码效率,那怎么避免差异?
    • 可以使用 b.ResetTimer()可重置定时器
    • 可以使用 b.StopTimer() 暂停计时
    • 可以使用 b.StartTimer() 开始计时

使用benchmark的简单例子

// fib.go
package main

func fib(n int) int {
    if n == 0 || n == 1 {
        return n
    }
    return fib(n-2) + fib(n-1)
}

// fib_test.go
package main

import "testing"

func BenchmarkFib(b *testing.B) {
    for n := 0; n < b.N; n++ {
        fib(30) // run fib(30) b.N times
    }
}

// 运行用例
$ go test -bench .
goos: darwin
goarch: amd64
pkg: example
BenchmarkFib-8               200           5865240 ns/op
PASS
ok      example 1.782s
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容