Benchmark函数需以Benchmark开头,参数为*testing.B,用b.N控制循环次数,避免在循环外初始化或循环内打印;通过go test -bench运行,结合-benchmem、-count生成数据,用benchstat对比新旧结果判断性能变化;若性能下降,使用-cpuprofile配合pprof分析热点函数,但profiling仅用于诊断不用于最终指标。

直接用 go test -bench 就能测 CPU 密集型函数的性能,关键是要写对 benchmark 函数、控制变量、理解结果含义。
函数名必须以 Benchmark 开头,参数类型固定为 *testing.B,内部用 b.N 控制循环次数:
b.ResetTimer() 排除)示例:
func BenchmarkFibonacci(b *testing.B) {
for i := 0; i < b.N; i++ {
fibonacci(35) // 纯计算,无副作用
}
}Go 的 go test -bench 默认统计的是“每次操作耗时(ns/op)”,它已自动排除了 setup 和 timer 暂停时间,但你仍需手动干预几处:
b.ReportAllocs() 查看是否意外分配内存(影响 GC 和缓存)b.StopTimer() + b.StartTimer() 跳过预热或数据准备阶段-benchmem 参数可同时显示内存分配统计例如预热后计时:
func BenchmarkHe*yCalc(b *testing.B) {
// 预热:不计入计时
warmup()
b.ResetTimer() // 重置计时器,从这里开始测
<pre class="brush:php;toolbar:false;">for i := 0; i < b.N; i++ {
he*yComputation()
}}
AdMaker AI
从0到爆款高转化AI广告生成器
65
查看详情
单次 go test -bench=. 结果可能受系统负载波动影响。可靠做法是:
-count=5 运行 5 次取中位数(Go 1.20+ 默认启用统计稳定性提示)benchstat 工具对比两个版本(如优化前后):$ go test -bench=BenchmarkFib -count=5 -run=^$ > old.txt $ # 修改代码后 $ go test -bench=BenchmarkFib -count=5 -run=^$ > new.txt $ benchstat old.txt new.txt
输出会明确告诉你性能提升/下降百分比和 p 值是否显著。
当 benchmark 显示变慢,但看不出原因时,用 CPU profile 深挖:
-cpuprofile=cpu.prof 生成采样文件go tool pprof cpu.prof 进入交互式分析top 看耗时最多的函数,web 生成调用图,list 函数名 查具体行注意:benchmark 中开启 profiling 会引入额外开销,仅用于诊断,不用于最终性能数字。
基本上就这些。不需要第三方库,Go 自带工具链已足够扎实 —— 关键是写干净的 benchmark、跑够次数、比对要严谨。
以上就是如何使用Golang Benchmark分析CPU密集型函数性能_Golang CPU性能测量方法的详细内容,更多请关注其它相关文
章!
相关文章:
Kafka Streams中基于消息头条件过滤消息的实现指南
反效果?《战地6》免费试玩开启后玩家数不升反降
2026春节假期票务安排_2026春节放假购票指南
浏览器打开即用 美图秀秀网页版入口
J*aScript中赋值与自增运算符的复杂交互与执行机制
Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧
Typer应用中灵活处理命令行参数的令牌化与解析
支付宝如何设置安全保护_支付宝安全设置的全面教程
网易大神怎么保存别人动态的图片_网易大神动态图片保存方法
如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】
PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程
照顾宝贝2小游戏免费秒玩入口
Mac怎么查看崩溃日志_Mac控制台错误报告分析
Archive of Our Own官网直达 AO3最新可用地址一览
修复二维数组索引越界异常:一维循环到二维坐标的正确映射
Lar*el 中按“Has One Of Many”关联模型排序的最佳实践
Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值
PHP基于会话的用户类型页面访问控制指南
俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口
将JSON对象数组转置为键值对列表的实用指南
12306选座如何查看座位示意图_12306座位示意图解读与使用
Python模块化编程:有效管理依赖与避免循环引用
冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法
HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解
Go语言中高效处理x-www-form-urlencoded表单数据
React/Next.js中实现列表项的动态选择与移动
AO3网页版合集入口 Archive of Our Own同人作品浏览指南
QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道
Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议
Selenium Python中处理点击后新窗口加载冻结问题的策略与实践
高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】
凉拌黄瓜怎么拌更入味 凉拌黄瓜简单家常做法
优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践
格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施
在Go开发中优雅管理ListenAndServe进程:GoSublime集成方案
抖音网页版企业服务中心登录入口_抖音网页版企业登录平台
《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情
PDF文件体积过大处理_PDF压缩技巧详解
微信聊天记录怎么加密_微信聊天记录加密方法
在Typer应用中优雅地处理和重组任意命令行参数
MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏
在Pyomo中实现基于变量的条件约束:Big-M方法详解
mc.js免安装版 mc.js一键畅玩入口
C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能
c++如何使用Meson构建系统_c++比CMake更快的构建工具
汽水音乐在线解析 汽水音乐在线解析入口
Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置
Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略
C++如何解决segmentation fault_C++段错误调试与原因分析
一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法