您的位置 首页 编程知识

如何在Golang中使用sub-benchmark组织测试

Go的sub-benchmark通过b.Run()将基准测试拆分为多个子测试,便于对比不同参数或实现的性能,提…


Go的sub-benchmark通过b.Run()将基准测试拆分为多个子测试,便于对比不同参数或实现的性能,提升代码清晰度与可维护性。

如何在Golang中使用sub-benchmark组织测试

在Golang中,使用sub-benchmark可以将一个基准测试拆分为多个子基准,便于对不同参数或实现方式的性能进行对比。这种方式让代码更清晰、结构更模块化,也方便维护和扩展。

理解sub-benchmark的基本结构

Go的testing包支持通过b.Run()方法创建子基准测试。每个子基准独立运行,并在结果中单独显示性能数据。

基准函数接收一个*testing.B类型的指针,调用Run方法时传入子测试名和对应的函数。

示例:

立即学习“”;

 func BenchmarkConcat(b *testing.B) {     b.Run("StringBuilder", func(b *testing.B) {         for i := 0; i < b.N; i++ {             var sb strings.Builder             sb.WriteString("hello")             sb.WriteString("world")             _ = sb.String()         }     })      b.Run("ByteSlice", func(b *testing.B) {         for i := 0; i < b.N; i++ {             bs := []byte{}             bs = append(bs, "hello"...)             bs = append(bs, "world"...)             _ = string(bs)         }     }) } 
登录后复制

动态生成sub-benchmark

当需要测试多种输入规模时,可以用循环动态创建子基准,避免重复代码。

子基准名称通常包含变量值,以便区分输出结果。

示例:测试不同字符串长度下的性能

AI面试助手,在线面试神器,助你轻松拿Offer

如何在Golang中使用sub-benchmark组织测试 39

 func BenchmarkStringRepeat(b *testing.B) {     for _, size := range []int{10, 100, 1000} {         b.Run(fmt.Sprintf("Size%d", size), func(b *testing.B) {             s := strings.Repeat("a", size)             b.ResetTimer()             for i := 0; i < b.N; i++ {                 _ = strings.ToUpper(s)             }         })     } } 
登录后复制

注意:b.ResetTimer()用于排除准备数据的时间,确保只测量核心逻辑。

组织多个相关基准

你可以把一组相关的归在一个顶级benchmark下,比如比较JSON、Gob、XML等序列化方式的性能。

这样运行 test -bench=.时,会清晰展示每种子测试的结果。

示例:序列化性能对比

 func BenchmarkSerialization(b *testing.B) {     data := struct{ Name string }{Name: "gopher"}      b.Run("JSON", func(b *testing.B) {         for i := 0; i < b.N; i++ {             bytes, _ := json.Marshal(data)             _ = bytes         }     })      b.Run("Gob", func(b *testing.B) {         for i := 0; i < b.N; i++ {             buf := new(bytes.Buffer)             enc := gob.NewEncoder(buf)             enc.Encode(data)         }     }) } 
登录后复制

运行后输出类似:

 BenchmarkSerialization/JSON-8          5000000           210 ns/op BenchmarkSerialization/Gob-8           3000000           400 ns/op 
登录后复制

运行特定子基准

使用-bench标志可运行特定子测试。例如:

  • go test -bench=Concat$ —— 只运行顶层BenchmarkConcat
  • go test -bench=Concat/StringBuilder —— 只运行指定子项

正则匹配需注意斜杠路径格式。调试时可结合-run跳过单元测试,如-run=^$

基本上就这些。用好sub-benchmark能让性能测试更有条理,结果更易读。

以上就是如何在Golang中使用sub-benchmark组织测试的详细内容,更多请关注php中文网其它相关文章!

相关标签:

大家都在看:

本文来自网络,不代表四平甲倪网络网站制作专家立场,转载请注明出处:http://www.elephantgpt.cn/16273.html

作者: nijia

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

联系我们

18844404989

在线咨询: QQ交谈

邮箱: 641522856@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部