如何使用Golang基准测试评估函数性能_统计执行时间和分配
技术百科
P粉602998670
发布时间:2025-12-26
浏览: 次 Go testing包支持基准测试,函数名以Benchmark开头并接收*testing.B参数,循环体用b.N;运行go test -bench=.可得ns/op、B/op、allocs/op等指标,配合-benchmem、-gcflags="-m"及pprof可深度优化性能。
Go 的 testing 包内置了基准测试(benchmark)功能,能自动统计函数的平均执行时间、内存分配次数和字节数,无需手动打点或依赖第三方工具。
编写基准测试函数
基准测试函数名必须以 Benchmark 开头,接收 *testing.B 参数。测试逻辑需放在 b.N 循环中,框架会自动调整 N 值使测试持续约1秒,从而获得稳定统计值。
- 函数签名固定为
func BenchmarkXxx(b *testing.B) - 避免在循环外初始化耗时资源(如打开文件、建立连接),否则会污染统计结果
- 若需预热或一次性准备,放在循环前;若每次迭代都需要独立状态,放在循环内
运行基准测试并查看核心指标
使用 go test -bench=. 运行所有基准测试。关键输出字段含义如下:
- ns/op:单次操作平均耗时(纳秒),数值越小性能越好
- B/op:每次操作平均分配的字节数
- allocs/op:每次操作平均发生的内存分配次数
例如:BenchmarkAdd-8 10000000 124 ns/op 0 B/op 0 allocs/op 表示在8核上运行1000万次,平均每次124纳秒、无内存分配。
控制内存分配统计精度
默认情况下,Go 仅对显式调用 new、make 或字面量创建的堆对象计数。逃逸分析可能将小对象分配到栈上,导致 allocs/op 显示为 0,但实际仍有开销。可通过 -gcflags="-m" 查看变量是否逃逸:
-
go run -gcflags="-m" main.go输出逃逸分析结果 - 若想强制触发堆分配用于测试,可用指针取地址后传入接口或全局变量
- 使用
b.ReportAllocs()确保开启内存统计(新版 Go 默认开启,但仍建议显式调用)
对比多个实现并识别优化点
用 -benchmem 显式启用内存统计,配合 -bench 指定正则匹配多个函数,便于横向对比:
go test -bench="^Benchmark(Add|Sum)$" -benchmem- 关注
B/op和allocs/op的变化:减少分配通常意味着更少 GC 压力和更好缓存局部性 - 结合
pprof进一步分析(go test -cpuprofile=cpu.out -bench=.)
定位热点路径
# ai
# 放在
# 多个
# 越好
# 可通过
# 第三方
# 能将
# 热点
# 工具
# 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; ?>
】
相关推荐
- Python对象比较与排序_魔术方法解析【教程】
- Win11系统占用空间大怎么办 Win11深度瘦身
- PHP的FastAdmin架构适合二次开发吗_特点
- Go 中 defer 语句在 goroutine
- MAC怎么使用表情符号面板_MAC Emoji快捷
- Python与MongoDB NoSQL开发实战_
- C++中的协变与逆变是什么?C++函数指针与返回类
- 如何减少Golang内存碎片化_Golang内存分
- Win11怎么设置任务栏透明_Windows11使
- Win11怎么更改计算机名_Windows11系统
- Windows音频驱动无声音原因解析_声卡驱动错误
- Win11关机界面怎么改_Win11自定义关机画面
- Win11如何设置省电模式 Win11开启电池节电
- 如何使用Golang实现路由分组管理_Golang
- 如何在Windows上设置闹钟和计时器_系统自带的
- Python日志系统设计与实现_高可观测性架构实战
- Win10怎么卸载迅雷_Win10彻底卸载迅雷方法
- c++怎么设置线程优先级与cpu亲和性_c++ 多
- 如何使用Golang管理跨项目依赖_Golang多
- c++中如何求一个数的平方根_c++ sqrt函数
- c++协程和线程的区别 c++异步编程模型对比【核
- Win11怎样安装剪映专业版_Win11安装剪映教
- Python与Docker容器化部署实战_镜像构建
- c++怎么编写动态链接库dll_c++ __dec
- Win11怎么更改默认打开方式_Win11关联文件
- Windows10系统怎么查看系统版本_Win10
- c++中的Tag Dispatching是什么_c
- Win11怎么打开旧版计算器_Win11恢复传统计
- php下载安装后memory_limit怎么设置_
- Win11任务栏怎么调到左边_Win11开始菜单居
- 如何使用Golang处理网络超时错误_Golang
- Mac如何修改Hosts文件?(本地开发与屏蔽网站
- Win10电脑C盘红了怎么清理_Windows10
- Win11怎么开启远程桌面连接_Windows11
- Win10怎样清理C盘Steam游戏缓存_Win1
- Win11键盘快捷键大全_Windows 11常用
- c++中的CRTP是什么 c++奇异递归模板模式【
- Windows系统被恶意软件破坏后的恢复策略_错误
- 如何在Golang中处理数据库事务错误_回滚和日志
- Python字符串操作教程_切片拼接与格式化详解
- Windows10系统怎么查看显卡型号_Win10
- 如何在 Go 中调用动态链接库(.so)中的函数
- Linux怎么禁止Root用户远程登录_Linux
- Python配置文件操作教程_JSONINIYAM
- Win11怎么设置默认输入法 Win11固定中文输
- Python数据挖掘核心算法实践_聚类分类与特征工
- MAC如何设置网卡MAC地址克隆_MAC终端修改物
- Win10 BitLocker加密教程 Win10
- Win10怎么查看内存时序参数_Win10CPU-
- Python数据挖掘进阶教程_分类回归与聚类案例解

定位热点路径
QQ客服