ns/op表示每次操作的平均纳秒数,反映函数执行速度,数值越小性能越好;b/op表示每次操作分配的字节数,体现内存分配量,越低则gc压力越小;allocs/op表示每次操作的内存分配次数,次数越少说明堆分配越少,gc开销越低;结合benchstat工具对比优化前后这三个指标的变化,可系统评估性能改进效果,优先优化热点路径上的高频函数,通过减少不必要计算、预分配容量、复用对象等方式降低三项指标,从而提升整体程序性能。
在Go语言中,基准测试(benchmark)是评估代码性能的重要手段。通过
go test -bench=.
BenchmarkMyFunc-8 1000000 1250 ns/op 150 B/op 3 allocs/op
要真正理解这段输出的意义,关键在于解读
ns/op
B/op
allocs/op
ns/op
立即学习“go语言免费学习笔记(深入)”;
例如,
1250 ns/op
注意点:
ns/op
ns/op
B/op
比如
150 B/op
为什么关注这个?
make
new
常见优化手段:
sync.Pool
strings.Builder
+=
allocs/op
new
make
例如
3 allocs/op
为什么它重要?
举个例子:
func Bad() []int { s := make([]int, 0) s = append(s, 1) s = append(s, 2) return s }
每次调用都会触发至少一次切片扩容(可能两次分配),而如果预设容量:
s := make([]int, 0, 2)
就可以减少分配次数,从而降低
allocs/op
当你进行性能优化时,建议使用
benchstat
benchcmp
benchstat
先保存优化前的结果:
go test -bench=MyFunc -count=5 > before.txt
优化代码后,再运行:
go test -bench=MyFunc -count=5 > after.txt
使用
benchstat
benchstat before.txt after.txt
输出可能类似:
name old time/op new time/op delta MyFunc 1250ns ± 3% 950ns ± 2% -24.00% name old alloc/op new alloc/op delta MyFunc 150B ± 0% 80B ± 0% -46.67% name old allocs/op new allocs/op delta MyFunc 3.00 ± 0% 1.00 ± 0% -66.67%
从这份报告可以看出:
这说明优化非常有效。
并不是所有函数都需要极致优化。你应该优先关注:
对于这些函数,
ns/op
同时也要注意:
pprof
基本上就这些。理解
ns/op
B/op
allocs/op
以上就是怎样解读Golang基准测试结果 分析ns/op与内存分配指标的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号