新闻中心

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

2025-11-06
浏览次数:
返回列表
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

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

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

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

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()用于排除准备数据的时间,确保只测量核心逻辑。

刺鸟创客 刺鸟创客

一款专业高效稳定的AI内容创作平台

刺鸟创客 110 查看详情 刺鸟创客

组织多个相关基准

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

这样运行go 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组织测试的详细内容,更多请关注其它相关文章!


# 可以用  # 太康网站seo优化费用  # 靖江网站推广稳定吗吗  # 网站建设仅800元  # 做搜狗网站优化排名软  # 济源360seo关键词排名代理  # 查关键词网站排名命令  # 窗帘设计网站推广方案  # 陶瓷店面营销推广方案  # 肥乡品牌网站建设价格  # 淇滨网站推广公司怎么样  # 相关文章  # 并在  # js  # 你可以  # 序列化  # 资源管理  # 如何在  # 多个  # 加载  # 性能测试  # app  # golang  # go  # json 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法  今日头条怎么同步内容到抖音_今日头条内容同步到抖音教程  AO3官方在线访问地址 Archive of Our Own最新镜像合集  谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航  在python-socketio事件处理器中安全访问Flask应用上下文  J*a实现学校排课程序_面向对象结构化项目示例  Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议  Lar*el Excel导入时生成自定义递增ID的策略与实践  PHP表单数据传递:如何通过隐藏输入字段获取动态ID  python3时间如何用calendar输出?  NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略  J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析  QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道  《燕云十六声》两周内达九百万玩家!位居畅销榜第五  Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求  痛风发作了怎么办? 快速止痛和后期饮食调理  J*a里如何使用N*igableMap进行导航操作_可导航Map操作技巧解析  2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示  PrimeNG Sidebar背景色自定义指南:CSS覆盖与主题化实践  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率  多闪网页版在线观看免费入口_多闪官网访问入口  Angular Material 垂直步进器:实现底部到顶部排序的教程  Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation  12306选座怎么选到临时改签座_12306改签选座策略与步骤  一加手机拍照效果不好怎么办 一加哈苏影像调校与专业模式使用教程【高手篇】  Go语言中JSON数据解析与字段访问教程  探索高级语言到原生C/C++的转译:挑战与内存管理策略  在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析  CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色  在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明  火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧  如何在 Excel Online 和 Google 表格中更改日期格式  漫蛙网页登录入口 漫蛙漫画官方授权网址  mcjs网页版在线存档 mcjs云存档登录入口  在WordPress中通过REST API获取BasicAuth保护的远程文章  Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示  响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配  深入理解J*a合成构造器:何时以及为何阻止其生成  C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件  Web Components中自定义开关组件状态同步的常见陷阱与解决方案  蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版  汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口  HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全  在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明  Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】  Win11怎么设置鼠标指针速度_Win11提高鼠标指针精确度选项  J*a里如何使用forEach遍历Map_Map遍历方法说明  解决移动端滚动问题的overflow属性应用指南  漫蛙漫画网页端入口 漫蛙2官方正版漫画站点 

搜索