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

在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官方正版漫画站点


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