如何在Golang中进行函数性能基准测试_Golang函数性能测试与优化方法-Golang

合法基准测试函数需命名为benchmarkxxx,签名固定为func benchmarkxxx(b *testing.b),被测逻辑置于b.resettimer()之后,用b.reportallocs()统计内存分配,避免循环内非必要操作。

Go 的 testing 包自带基准测试能力,无需第三方库,但必须用 go test -bench 运行,且函数名必须是 BenchmarkXxx 形式,否则会被忽略。

如何写一个合法的基准测试函数

基准测试函数签名固定为 func BenchmarkXxx(b *testing.B),b.N 是框架自动调整的循环次数,你不能手动设初值或 break —— 必须让 b.ResetTimer() 和 b.ReportAllocs() 配合实际被测逻辑。

  • 被测代码必须放在 b.ResetTimer() 之后,否则初始化开销会混入结果
  • 若函数有 setup 开销(如构建 map、解析 JSON),应放在 b.ResetTimer() 前
  • 调用 b.ReportAllocs() 才能显示内存分配统计(B/op 和 allocs/op)
  • 避免在循环体内做非被测操作(比如拼接字符串再丢弃),这会污染性能数据
func BenchmarkFindInSlice(b *testing.B) {
    data := make([]int, 1000)
    for i := range data {
        data[i] = i
    }
    b.ResetTimer() // 计时从此开始
    b.ReportAllocs()

    for i := 0; i < b.N; i++ {
        _ = findInSlice(data, 500) // 只测这个函数调用
    }
}

为什么 go test -bench=. 跑不出结果

常见原因不是代码写错,而是文件命名或运行方式不对:基准测试必须写在 _test.go 文件里,且该文件不能带 //go:build 约束(除非显式启用),同时要确保当前目录下有对应包的源码(不能只留 test 文件)。

  • 文件名不以 _test.go 结尾 → 不被识别为测试文件
  • 用了 //go:build ignore 或 //go:build !test → 编译时被跳过
  • 执行命令时不在模块根目录,或 go.mod 缺失 → go test 找不到包
  • 函数名是 TestXxx 或 benchXxx(大小写/前缀错误)→ 不匹配 Benchmark 前缀规则

怎么对比两个函数的性能差异

用 -benchmem + -count=N 多次运行取中位数更可靠;想横向比对多个实现,直接在同一个 _test.go 里写多个 BenchmarkXxx 函数,go test -bench=^Benchmark(Linear|Binary)Search$ -benchmem 就能只跑指定几个。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 如何在Golang中进行函数性能基准测试_Golang函数性能测试与优化方法-Golang
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4015250+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4015250+
  • 本周更新: 0+
  • 最后更新: 2026-03-16