如何使用Golang benchmark测量函数延迟_统计执行耗时
技术百科
P粉602998670
发布时间:2026-01-01
浏览: 次 Go testing包原生支持基准测试,需用go test -bench运行且函数名以Benchmark开头、接收*testing.B参数;通过b.N循环执行待测逻辑,用b.ResetTimer()或b.StopTimer()排除初始化开销,b.ReportAllocs()统计内存分配。
Go 的 testing 包原生支持基准测试(benchmark),能准确统计函数执行耗时、吞吐量,并自动进行多次运行取平均,避免单次测量的偶然误差。关键在于用 go test -bench 运行,且函数需符合 BenchmarkXxx(*testing.B) 签名。
编写标准 benchmark 函数
基准函数必须接收 *testing.B 参数,且函数名以 Benchmark 开头。核心是调用 b.N 控制循环次数,把待测逻辑放在循环内:
- 不要在循环外初始化耗时资源(如打开文件、建连接),除非你明确想测初始化+执行总开销;若只关心纯计算延迟,应把初始化放在
b.ResetTimer()之前或b.StopTimer()区间内 -
b.ReportAllocs()可开启内存分配统计(如512 B/op) - 若函数依赖输入数据,建议在循环外预生成好,避免把数据构造时间算进延迟
示例:
func BenchmarkAdd(b *testing.B) {
a, bVal := 1, 2
b.ReportAllocs()
for i := 0; i < b.N; i++ {
_ = a + bVal // 待测逻辑
}
}
运行 benchmark 并解读结果
在包目录下执行:
go test -bench=^BenchmarkAdd$ -benchmem -count=3
-
-bench=^BenchmarkAdd$:正则匹配指定函数(^和$保证精确匹配) -
-benchmem:显示内存分配统计 -
-count=3:重复运行 3 次取中位数,减少噪声影响
输出类似:BenchmarkAdd-8 1000000000 0.34 ns/op 0 B/op 0 allocs/op
含义:在 8 核 CPU 上,执行 10⁹ 次,平均每次耗时 0.34 纳秒,无内存分配。
控制精度与排除干扰
默认情况下,Go 会自动调整 b.N 使单轮测试时长接近 1 秒。若函数极快(如纳秒级),可手动设最小时间避免过短测量:
-
b.SetMinimumTime(500*time.Millisecond):确保至少跑够 500ms 再停止 -
b.RunParallel(func(pb *testing.PB) { ...:并发运行,适合测并发场景(如 channel 操作、锁竞争)
}) - 避免在 benchmark 中打印、写磁盘、调网络 —— 这些 I/O 会严重污染延迟数据
对比多个实现的性能差异
用 b.Run() 组织子测试,便于横向比较:
func BenchmarkStringConcat(b *testing.B) {
s1, s2 := "hello", "world"
b.Run("plus", func(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = s1 + s2
}
})
b.Run("fmtSprint", func(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = fmt.Sprint(s1, s2)
}
})
}
运行后会分别输出 BenchmarkStringConcat/plus 和 BenchmarkStringConcat/fmtSprint 的耗时,直观看出哪种拼接更快。
# 放在
# 多个
# 时长
# 更快
# 后会
# 关键在于
# 哪种
# go
# golang
# 循环
# 并发
# channel
# 需用
# count
# 极快
# 应把
相关栏目:
<?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; ?>
】
相关推荐
- c++ nullptr与NULL区别_c++11空
- PHP怎么接收URL中的锚点参数_获取#后面参数值
- Win11 C盘满了怎么清理 Win11磁盘清理和
- php打包exe怎么传递参数_命令行参数接收方法【
- Windows11怎么用“记事本”自动换行与编码
- 微信短链接怎么还原php_用浏览器开发者工具抓包获
- php转exe用什么工具打包快_高效打包软件推荐【
- Windows10系统服务优化指南_Win10禁用
- Win10怎么设置开机密码_Windows10账户
- Win11如何开启telnet服务 Win11启用
- Win11怎么设置应用分屏_Windows11贴靠
- 如何解决Windows字体显示模糊的问题?(Cle
- Win11怎么关闭键盘按键音_Win11禁用打字声
- 如何使用正则表达式批量替换重复的“-”模式为固定字
- 如何使用Golang编写单元测试_创建Test函数
- php485函数怎么捕获异常_php485错误处理
- Windows 11登录时提示“用户配置文件服务登
- Windows10任务栏图标变成白色文件_Win1
- 如何高效删除 NumPy 二维数组中所有元素相同的
- 如何使用Golang安装API文档生成工具_快速生
- Win11如何更新显卡驱动 Win11检查和安装设
- 如何在 ACF 中正确更新嵌套多层 Group 字
- VSC里PHP变量未定义报错怎么解决_错误抑制技巧
- Win11时间不对怎么同步_Win11自动校准互联
- Win11怎么开启智能存储_Windows11存储
- 如何在Golang中使用log包输出不同级别日志_
- 如何更改Windows资源管理器的默认启动位置?(
- Win11怎么关闭OneDrive同步_Win11
- Win11截图快捷键是什么_Win11自带截图工具
- php打包exe后无法读取环境变量_变量配置方法【
- 如何在Golang中编写端到端测试_Golang
- 手机php怎么转mp4_手机端php文件转mp4a
- Python函数接口文档化_自动化说明【指导】
- Win11怎么关闭任务栏小图标_Windows11
- Windows10怎么用“讲述人”读屏辅助 Win
- 使用类变量定义字符串常量时的类型安全最佳实践
- Windows10电脑怎么设置虚拟光驱_Win10
- Win11怎么设置触控板手势_Windows11三
- php485在php5.6下能用吗_php485旧
- Win11如何暂停系统更新 Win11暂停更新最长
- 如何正确访问 Laravel 模型或对象的属性而非
- Win11怎么更改管理员名字 Win11修改账户名
- c++怎么编写动态链接库dll_c++ __dec
- Windows 10怎么把任务栏放在屏幕上方_Wi
- Win10文件历史记录怎么用 Win10开启自动备
- Win11鼠标灵敏度怎么调 Win11鼠标指针移动
- php订单日志怎么记录物流_php记录订单物流变更
- Win11怎么关闭触控板_Win11笔记本禁用触摸
- PowerShell怎么创建复杂的XML结构
- php订单日志怎么导出excel_php导出订单日

})
QQ客服