Go 的 Benchmark 函数必须命名为 BenchmarkXXX(*testing.B),调用 b.N 循环执行被测逻辑,初始化代码置于 b.ResetTimer() 前,调用 b.ReportAllocs() 获取内存分配统计。
Go 自带的 testing 包支持基准测试(Benchmark),不需要额外安装工具,但必须理解它不是模拟并发用户请求的“压测”,而是测量单个函数在受控条件下的执行性能。
Go 的 go test 只识别形如 BenchmarkXXX(*testing.B) 的函数。它和普通测试函数不同:不能用 t.Fatal,必须调用 b.N 控制循环次数,且被测逻辑需放在 b.ResetTimer() 和 b.ReportAllocs() 附近以排除初始化干扰。
b.N 是框架自动调整的迭代次数,不是你手动指定的“跑 1000 次”——它会根据首次运行耗时动态扩增,确保总耗时稳定在 1 秒左右b.ResetTimer() 之前,否则会污染结果b.ReportAllocs() 才能在结果中看到内存分配统计(B/op 和 allocs/op)func BenchmarkAdd(b *testing.B) { b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { _ = add(1, 2) } }
用 go test -bench=. 运行,默认只显示耗时(ns/op)。加上 -benchmem 才显示内存数据;加上 -count=3 可跑多次取平均值,避免单次抖动影响判断。
1000000000 表示跑了 10 亿次,1.23 ns/op 是每次平均耗时——数值越小越好2 B/op 表示每次调用分配了 2 字节内存,0 allocs/op 表示没触发堆分配——这对高频函数很关键500000000 3.45 ns/op,说明函数较慢,Go 自动减少了 b.N 次数来保证单轮不超时testing.B 是单 goroutine 循环调用,不涉及网络、I/O 等阻塞操作,也不模拟多客户端并发竞争资源。它测的是“理想路径下函数的纯 CPU 性能”。比如:
立即学习“go语言免费学习笔记(深入)”;
json.Marshal 可以,但测 HTTP handler 不行——handler 里有 net/http 的调度、TLS 握手、连接复用等不可控变量sync.Map.Load 有意义,但测整个 API 接口的 QPS 就会严重高估——实际瓶颈往往在数据库连接池或锁争用上ab、hey 或 vegeta 这类外部工具打真实 endpoint最容易踩的坑是让编译器优化掉被测逻辑,或者把副作用留在循环外。
result := add(1,2); for i:=0; i → 整个循环被优化为空,结果是 0 ns/op,毫无意义
_ = 或用 result,导致 Go 认为返回值未使用而内联/消除调用fmt.Println)或 sleep → 结果反映的是系统调用耗时,不是函数本身性能time.Now() 手动计时 → 绕过 testing.B 的自适应机制,且纳秒级时间获取本身有开销真正要定位线上性能瓶颈,得先用 pprof 抓 CPU profile,再针对 hot path 写精准 benchmark;盲目对整个 handler 跑 benchmark,往往只验证了“这段代码确实挺快”,却掩盖了真正的慢点。
# js
# json
# go
# golang
# 字节
# 工具
# 并发请求
# 为什么
# count
# for
# 循环
# 接口
# 堆
# map
# 并发
# 数据库
# http
# 的是
# 放在
# 就会
# 也不
# 首次
# 不需要
# 这段
# 能在
# 这类
# 这对
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Mac怎么安装软件_Mac安装dmg与pkg文件的区别【指南】
Python解释执行模型_字节码流程说明【指导】
c# 如何用c#实现一个支持优先级的任务队列
Mac的“调度中心”与“空间”怎么用_Mac多桌面高效管理【技巧】
Win11怎么关闭贴靠布局_Win11禁用窗口最大化时的布局菜单
Mac如何与安卓手机传文件_Mac和Android设备互通【必备工具】
Win11怎么关闭定位服务 Win11禁止应用获取位置信息【隐私】
Win10系统字体模糊怎么办_Windows10高级缩放设置修复
Win11怎么设置默认视频播放器_Windows 11关联媒体文件打开方式【步骤】
win11如何清理传递优化文件 Win11为C盘瘦身删除更新缓存【技巧】
如何在Golang中使用log包输出不同级别日志_Golang log日志管理与分类
如何使用Golang安装API文档生成工具_快速生成接口文档
Win11怎么设置右键刷新选项_Windows11显示更多选项技巧
php中::能用于接口静态方法吗_接口静态方法调用规则【操作】
Go 中 defer 语句在 goroutine 内部不返回时不会执行
如何在Golang中实现服务熔断与限流_Golang微服务容错与流控方法
c++如何使用std::bitset进行位图算法_c++ 快速查找与大规模数据排重【方法】
Windows10电脑怎么设置防火墙出站规则_Win10禁止程序联网教程
Python函数参数高级用法_默认值与可变参数解析【教程】
Win11如何设置环境变量 Win11添加和修改系统与用户变量【教程】
Win11怎么关闭触摸屏_禁用Win11笔记本触摸屏功能设置【教程】
c++中如何对数组进行排序_c++数组排序算法汇总
C++中引用和指针有什么区别?(代码说明)
Mac如何查看电池健康百分比_Mac系统信息电源检测
Python集合操作技巧_高效去重解析【教程】
如何在同包不同文件中正确引用 Go 结构体
Windows10电脑怎么设置自动连接WiFi_Win10无线网络属性勾选
如何使用正则表达式批量替换重复的星号-短横模式为固定字符串
Win11怎么更改默认打开方式_Win11关联文件格式教程【详解】
PythonPandas数据分析教程_数据清洗与处理技巧
如何使用Golang实现路由参数绑定_使用Mux和Request解析路径变量
Python随机数生成_random模块说明【指导】
windows如何测试网速_windows系统网络速度测试方法
Linux如何安装Golang环境_Linux下Go语言开发包配置【方法】
Python安全爬虫设计_IP代理池与验证码识别策略解析
MAC如何快速搜索大文件_MAC磁盘空间分析与冗余数据清理【方法】
如何有效拦截拼接式恶意域名的垃圾信息
如何使用Golang实现容器自动化运维_Golang Docker运维管理方法
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
如何在Windows上设置闹钟和计时器_系统自带的时钟应用全攻略【生活技巧】
Mac怎么查看活动监视器_理解Mac进程和资源占用【指南】
Win10怎样卸载自带Edge_Win10卸载Edge浏览器步骤【教程】
Win11怎么设置ipv4地址_Windows 11固定静态IP地址配置教程【详解】
Python对象生命周期管理_创建销毁说明【指导】
如何在 Go 中高效缓存与分发网络视频流
php485在php5.6下能用吗_php485旧版本兼容性问题说明【详解】
Win11如何设置系统声音_Win11系统声音调整教程【攻略】
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
如何使用Golang实现聊天室消息存档_存储聊天记录到文件
Golang如何避免指针逃逸_Golang逃逸分析与堆栈优化策略
2026-01-03
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。