如何使用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; ?>
】
相关推荐
- 如何在Golang中写入XML文件_生成符合规范的
- Mac如何使用听写功能_Mac语音输入打字【效率技
- 如何在Golang中使用time处理时间_Gola
- Win11时间怎么同步到原子钟 Win11高精度时
- c++ reinterpret_cast怎么用 c
- php命令行怎么运行_通过CLI模式执行PHP脚本
- Win11任务栏怎么调到左边_Win11开始菜单居
- mac怎么安装字体_MAC添加第三方字体与字体册管
- 短链接怎么用php递归还原_多层加密链接的处理法【
- 如何使用Golang反射创建map对象_动态生成键
- C++中引用和指针有什么区别?(代码说明)
- 如何使用正则表达式精确匹配最多含一个换行符的 st
- Win10如何卸载WindowsDefender_
- 如何使用Golang实现文件加密_Golang c
- Windows10系统怎么查看设备管理器_Win1
- Win11无法拖拽文件到任务栏怎么办_Win11开
- MySQL 中使用 IF 和 CASE 实现查询字
- 如何使用Golang处理静态文件缓存_提高页面加载
- Python数据挖掘进阶教程_分类回归与聚类案例解
- 如何使用Golang实现微服务状态监控_Golan
- c# Task.Yield 的作用是什么 它和Ta
- php下载安装包怎么选_threadsafe与nt
- php会话怎么开启_session_start函数
- PhpStorm怎么调试PHP代码_PhpStor
- Win11怎么设置应用分屏_Windows11贴靠
- Windows10无法连接到Internet_Wi
- Windows10系统怎么查看IP地址_Win10
- Win11怎么关闭系统透明度_Windows11个
- Win11怎么硬盘分区 Win11新建磁盘分区详细
- php485返回数据不完整怎么办_php485数据
- Win11怎么设置虚拟桌面 Win11新建多桌面切
- Win11怎么关闭自动修复_跳过Win11开机自动
- 短链接怎么用php还原_从基础原理到代码实现教学【
- C++如何解析JSON数据?(nlohmann/j
- Drupal 中 HTML 链接被重复转义导致渲染
- Win10电脑怎么设置网络名称_Windows10
- c++如何利用doxygen生成开发文档_c++
- Python网络超时处理_健壮性设计说明【指导】
- PHP的FastAdmin架构适合二次开发吗_特点
- Win11怎么关闭键盘按键音_Win11禁用打字声
- Mac如何彻底清理浏览器缓存?(Safari与Ch
- Python抽象类与接口设计_规范说明【指导】
- 如何用正则与预处理高效拦截带干扰符的恶意域名
- 如何在同包不同文件中正确引用 Go 结构体
- Django 密码修改后会话失效的解决方案
- php8.4如何实现队列任务_php8.4redi
- Windows10如何更改计算机工作组_Win10
- 如何使用Golang reflect检查方法数量_
- Golang如何测试HTTP中间件_Golang
- Win10如何优化内存使用_Win10内存优化技巧

})
QQ客服