如何使用Golang table-driven基准测试_多组数据测量函数效率
技术百科
P粉602998670
发布时间:2026-01-02
浏览: 次 Go语言table-driven基准测试通过testing.B对多组输入数据独立计时,支持算法性能对比与边界case评估;需用b.Run()为每组参数创建子基准,命名含关键参数,并避免预处理污染计时。
Go 语言的 table-driven 基准测试(benchmarks)是验证函数在不同输入规模或数据特征下性能表现的高效方式。它不像单元测试那样只关注“对错”,而是聚焦“快慢”——尤其适合对比算法优化、评估边界 case、发现隐式性能退化。
用 testing.B 驱动多组数据循环
基准测试函数签名固定为 func BenchmarkXxx(*testing.B),其中 *testing.B 提供了计时、迭代控制和报告能力。要测多组数据,只需在 B.Run() 中为每组参数创建子基准:
- 每个子基准独立计时、独立运行(默认至少 1 秒,自动调整迭代次数)
- 子基准名建议含关键参数(如
"100"、"sorted"),便于识别 - 避免在
B.ResetTimer()前做耗时预处理(如生成大数据),否则会污染测量
构造清晰的测试表(table)
定义一个结构体切片,每项包含输入数据、预期行为(可选)、描述性标签。例如测字符串查找函数:
var benchCases = []struct {
name string
data string
want int
}{
{"short", "hello world", 6},
{"long", strings.Repeat("a", 10000) + "x", 10000},
{"empty", "", 0},
}
然后遍历运行:
func BenchmarkFindIndex(b *testing.B) {
for _, tc := range benchCases {
b.Run(tc.name, func(b *testing.B) {
b.ReportAllocs() // 可选:记录内存分配
for i := 0; i < b.N; i++ {
_ = findIndex(tc.data, 'x') // 实际被测函数
}
})
}
}
注意初始化与复位时机
若每次迭代需重建状态(如新建 map、重置 slice),应放在 b.ResetTimer() 之后;若只需一次初始化(如预编译正则),放在 b.ResetTimer() 之前:
-
b.ResetTimer()重置计时器和分配计数器,通常放在循环前 - 耗时初始化(如读文件、生成百万元素 slice)必须在
ResetTimer前完成,且只做一次 - 避免在循环内重复初始化——那测的是初始化开销,不是目标函数
运行与解读结果
执行 go test -bench=. -benchmem:
-
BenchmarkFindIndex/short-8 10000000 124 ns/op 0 B/op 0 allocs/op表示每操作平均 124 纳秒,无内存分配 - 子基准名用斜杠分隔(
/short),方便-bench=FindIndex/long单独运行某组 -
-benchmem显示每次操作的平均内存分配字节数和次数,对排查 GC 压力很关键
# 大数据
# go语言
# go
# golang
# 循环
# 堆
# 字节
# 字符串
# 结构体
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何使用Golang实现函数指针_函数变量与回调示
- 如何使用 Selenium 正确获取篮球参考网站球
- 如何在 Django 中修改用户密码后保持会话不丢
- 如何使用 Python 合并文件夹内多个 Exce
- C#如何在一个XML文件中查找并替换文本内容
- Win11任务栏怎么放到顶部_Win11修改任务栏
- Win11怎么禁用键盘自带键盘_Win11笔记本禁
- Win11怎么关闭任务栏小图标_Windows11
- Win11怎么查看已连接wifi密码 Win11查
- Win10如何更改任务栏高度_Windows10解
- 如何在JavaScript中动态拼接PHP的bas
- php接口返回数据乱码怎么办_php接口调试编码问
- Python并发安全问题_资源竞争说明【指导】
- 如何使用Golang捕获测试日志_Golang t
- Win11如何设置省电模式 Win11开启电池节电
- Mac怎么开启“任何来源”_Mac安装未签名应用的
- Win11怎么关闭小组件_Win11禁用任务栏天气
- 如何使用Golang进行HTTP服务性能测试_测量
- Go 语言标准库为何不提供泛型 Contains
- Win11怎么开启游戏模式_Windows11优化
- Win11怎样安装钉钉客户端_Win11安装钉钉教
- 为什么本地php环境运行php脚本卡顿_php执行
- Win10如何备份注册表_Win10注册表备份步骤
- php中self::能调用子类重写的方法吗_静态绑
- PHP怎么接收前端传的时间戳_处理时间戳参数转换技
- 怎么将XML数据可视化 D3.js加载XML
- 如何使用正则表达式批量替换重复的“-”模式为固定字
- Windows笔记本无法进入睡眠模式怎么办?(电源
- Win11搜索栏无法输入_解决Win11开始菜单搜
- Python与OpenAI接口集成实战_生成式AI
- Win11怎么关闭键盘按键音_Win11禁用打字声
- Windows10怎么查看硬件信息_Windows
- Win11蓝牙开关不见了怎么办_Win11蓝牙驱动
- Win11如何设置文件权限 Win11 NTFS文
- 如何在 Go 中比较自定义的数组类型(如 [20]
- Win11怎么设置任务栏对齐方式_Windows1
- Python代码测试策略_质量保障解析【教程】
- 如何使用Golang开发基础文件下载功能_Gola
- php8.4如何配置ssl证书_php8.4htt
- Mac电脑如何恢复出厂设置_Mac抹掉数据并重装系
- Win11如何开启telnet服务 Win11启用
- Windows如何使用注册表查找和删除项?(reg
- Win11怎么设置鼠标宏_Win11鼠标按键自定义
- WindowsUSB驱动安装异常怎么办_USB驱动
- 如何在Golang中捕获结构体方法错误_Golan
- C++如何获取CPU核心数?(std::threa
- 如何在 Pandas 中按元素交集合并两列字符串
- Windows如何拦截2345弹窗广告_Windo
- 如何在Windows上设置闹钟和计时器_系统自带的
- Windows蓝屏错误0x0000001E怎么修复

QQ客服