如何使用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; ?>
】
相关推荐
- Win11怎么查看已连接wifi密码 Win11查
- Win11怎么查看显卡温度 Win11任务管理器查
- 如何在JavaScript中动态拼接PHP的bas
- 怎么将XML数据可视化 D3.js加载XML
- php和redis连接超时怎么办_phpredis
- windows系统如何安装cab更新补丁_wind
- php高频调试功能有哪些_php常用调试函数与工具
- 如何使用 Selenium 正确获取篮球参考网站球
- Win11怎么设置虚拟桌面 Win11新建多桌面切
- 如何使用正则表达式精确匹配最多含一个换行符的 st
- 微信里的php文件怎么变mp4_微信接收php转m
- 如何使用正则表达式提取以编号开头、后接多个注解的逻
- PhpStorm怎么调试PHP代码_PhpStor
- Win10如何备份注册表_Win10注册表备份步骤
- php中::能用于接口静态方法吗_接口静态方法调用
- windows如何禁用驱动程序强制签名_windo
- MAC如何快速搜索大文件_MAC磁盘空间分析与冗余
- Win11怎么设置系统还原_Windows11系统
- Python脚本参数接收_sys与argparse
- 如何在Golang中实现WebSocket广播_使
- 如何用正则表达式精确匹配“start”到“end”
- 如何使用Golang实现路由分组管理_Golang
- C#如何使用XPathNavigator高效查询X
- php查询数据怎么导出csv_查询结果转csv文件
- Win11怎么设置默认邮件客户端 Win11修改M
- XML的“混合内容”是什么 怎么用DTD或XSD定
- c# 在高并发场景下,委托和接口调用的性能对比
- Python解释执行模型_字节码流程说明【指导】
- Win10如何关闭安全中心所有通知 Win10禁用
- Win11关机快捷键是什么_Win11快速关机方法
- Win10怎么卸载鲁大师_Win10彻底卸载鲁大师
- Linux怎么设置磁盘配额_Linux系统Quot
- 如何使用Golang搭建Web开发环境_快速启动H
- Win11怎么开启自动HDR画质_Windows1
- 如何在Golang中操作嵌套切片指针_Golang
- php删除数据怎么加限制_带where条件删除避免
- php订单日志怎么记录发货_php记录订单发货操作
- Win11怎么用设置清理回收站_Win11设置清理
- C++如何编写函数模板?(泛型编程入门)
- Win11 C盘满了怎么清理 Win11磁盘清理和
- Win11怎么设置环境变量_Win11配置Path
- Win10怎样清理C盘阿里旺旺缓存_Win10清理
- Python面向对象实战讲解_类与设计模式深入理解
- php增删改查报错1054怎么办_字段名错误排查修
- 作用域操作符会影响性能吗_php静态调用性能分析【
- MAC怎么用连续互通相机里的“桌上视角”_MAC在
- Python类装饰器使用_元编程解析【教程】
- Win10系统映像怎么恢复 Win10使用系统映像
- 如何使用Golang搭建本地API测试环境_快速验
- C++如何使用Qt创建第一个GUI窗口?(入门教程

})
QQ客服