新闻中心
Golang如何在Benchmark中测量函数执行时间
Go的Benchmark通过testing.B类型测量函数性能,使用go test -bench=.运行,函数名以Benchmark开头,循环执行b.N次以获得稳定数据。为防止编译器优化导致结果失真,应将返回值赋给变量并使用。通过var result int接收结果可避免零耗时问题。Benchmark还能自动统计内存分配,如16 B/op表示每次操作分配16字节。需确保被测代码在循环内执行,初始化开销可用b.ResetTimer()排除,结合b.StartTimer()和b.StopTimer()精确控制计时范围,从而准确评估函数的时间与内存开销。

在Go语言中,Benchmark 是测量函数执行时间的标准方式。它属于 Go 的测试包(testing),通过 go test -bench=. 命令运行,能够准确评估函数的性能表现。
使用 testing.B 进行基准测试
编写 Benchmark 函数时,函数名以 Benchmark 开头,参数为 *testing.B。Go 会自动调用该函数,并控制循环次数以获取稳定的性能数据。
示例:测量一个简单加法函数的执行时间
func Add(a, b int) int {
return a + b
}
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
Add(1, 2)
}
}
b.N 是 Go 自动调整的循环次数,确保测试运行足够长时间以获得可靠结果。你不需要手动计算耗时,Go 会自动统计。
避免编译器优化影响测试结果
如果被测函数返回值未被使用,编译器可能将其优化掉,导致测出时间为零。为防止这种情况,应将结果赋值给 bench对象的变量。
func BenchmarkAddSafe(b *testing.B) {
var result int
for i := 0; i < b.N; i++ {
result = Add(1, 2)
}
_ = result // 确保结果不被优化
}
更推荐的方式是使用 b.ReportMetric 或将结果绑定到 b,但最简单的防优化方法就是引入变量并使用它。
测量内存分配情况
Benchmark 不仅能测时间,还能统计每次操作的内存分配量和分配次数。只需在测试中触发内存操作,Go 会自动报告。
Pinokio
Pinokio是一款开源的AI浏览器,可以安装运行各种AI模型和应用
232
查看详情
示例:测试字符串拼接的内存开销
func BenchmarkStringConcat(b *testing.B) {
var s string
for i := 0; i < b.N; i++ {
s = "a" + "b"
}
_ = s
}
运行命令:
go test -bench=.
输出类似:
BenchmarkAdd-8 1000000000 0.30 ns/op
其中 0.30 ns/op 表示每次操作耗时约 0.3 纳秒。若涉及内存分配,还会显示如 16 B/op 2 allocs/op。
提升测试精度的小技巧
- 确保被测逻辑在循环内,且循环外不包含初始化开销(除非你想测整体)
- 使用 b.ResetTimer() 可重置计时器,排除预处理时间
- 用 b.StartTimer() 和 b.StopTimer() 控制计时范围
例如:测试前需初始化大量数据时
func BenchmarkWithSetup(b *testing.B) {
data := make([]int, 1000)
for i := range data {
data[i] = i
}
b.ResetTimer() // 开始计时
for i := 0; i < b.N; i++ {
sum := 0
for _, v := range data {
sum += v
}
}
}
基本上就这些。Go 的 benchmark 机制简洁高效,只要写好循环结构、防止优化、合理控制计时范围,就能准确测量函数执行时间。不复杂但容易忽略细节。
以上就是Golang如何在Benchmark中测量函数执行时间的详细内容,更多请关注其它相关文章!
# 为防止
# 百度营销全国推广
# 卷烟营销推广活动的目的
# 狼人seo在线视频
# 品牌低价网站推广公司
# 上海抖音seo竞价平台
# 电商网站优化英文怎么写
# 什么网站有策划方案推广
# 山东企业seo哪家好
# 如何查网站优化数据
# 淮安抖音营销推广
# 只需
# go
# 还会
# 就能
# 返回值
# 移除
# 应将
# 还能
# 如何在
# 执行时间
# 字节
# go语言
# golang
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
PHP表单数据传递:如何通过隐藏输入字段获取动态ID
“音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!
Python类型检查:优化关联可选属性的Mypy推断策略
Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】
J*a实现学校排课程序_面向对象结构化项目示例
sublime如何处理大型CSV文件的列对齐_sublime高级表格编辑插件指南
中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】
sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE
C++如何实现异步操作_C++11使用std::future和std::async进行异步编程
神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正
精准捕获:如何在页面中监听除特定元素外的所有点击事件
高德地图公交到站提醒失败如何解决 高德提醒权限设置
优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题
Go语言中JSON数据解码与字段访问指南
EMS快递官网app_中国邮政速递物流手机客户端
Pandas DataFrame:高效添加条件计算列
快手网页版在线登录 快手网页版官网入口快速访问
PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract
poki免费入口快捷访问 poki人气小游戏直接玩站点
想当下一个《2077》?《心之眼》Steam评价升至"多半好评"
不同用户不同价格! 索尼开启账户个性化定价测试
Angular中父组件异步更新子组件复选框状态的实践指南
192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台
React中useState与局部变量:理解组件状态管理与渲染机制
Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐
Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组
QQ网页版官方账号入口 QQ网页版网页版登录指南
深入理解J*aScript Promise异步执行与微任务队列
在FastAPI中利用lifespan与依赖注入高效管理Redis连接池
天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】
C#如何安全地从用户上传的XML文件中读取数据? 验证与清理策略
蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源
Excel函数批量查找替换超快方法_Excel用REPLACE和FIND函数秒级替换
零跑汽车11月交付量达70327台 实现连续9个月正增长
J*aScriptWebpack优化_J*aScript构建工具实战
sublime怎么格式化代码_sublime代码美化与一键排版插件配置
AO3官方在线访问地址 Archive of Our Own最新镜像合集
Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法
Centos/Linux 系统下安装 composer 的完整步骤
ArrayList与LinkedList操作复杂度详解:遍历与修改
vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法
sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统
在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明
C#使用XPath查询节点时出错? 常见语法错误与调试技巧
魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】
Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】
yy漫画网页版官方入口_yy漫画官网登录页面链接
抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站
中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】
在J*a中如何隐藏复杂性_使用门面模式组织对象交互


2025-10-29
浏览次数:次
返回列表