Go 的 testing 包基准测试自动记录 CPU 时间和内存分配;CPU 时间以 ns/op 表示单次执行平均纳秒数,反映执行快慢,通过 go test -bench 运行。
Go 的 testing 包自带的 benchmark 功能可以自动记录 CPU 时间和内存分配情况,无需额外工具。关键在于写规范的基准测试函数,并用 go test -bench 正确运行。
BenchmarkXXX 输出的 ns/op
每次 benchmark 运行时,Go 会多次执行被测函数(默认至少 1 秒),最终报告单次执行的平均纳秒数(ns/op)。这个值直接反映 CPU 消耗快慢。
示例:
func BenchmarkAdd(b *testing.B) {运行:go test -bench=BenchmarkAdd -benchmem
输出中类似 BenchmarkAdd-8 1000000000 0.32 ns/op 表示单次调用平均耗时 0.32 纳秒。
b.N 控制次数,不能写死数字(如 1000000),否则结果不准确-benchtime=10s 延长采样时间提升精度
Benchmem 输出的 B/op 和 allocs/op
启用 -benchmem 后,输出会追加两列:B/op(每次运行分配的字节数)和 allocs/op(每次运行发生的堆内存分配次数)。这两项反映内存压力大小。
例如:BenchmarkMapCreate-8 5000000 242 ns/op 128 B/op 2 allocs/op
B/op 高通常意味着对象体积大或复制多(如返回大结构体副本、频繁拼接字符串)allocs/op 高往往说明有隐式堆分配(如切片扩容、闭包捕获变量、interface{} 装箱)go tool pprof 结合 -memprofile 生成内存分析文件-benchmem -benchtime=3s 确保可比性横向比较多个 benchmark 时,需统一运行时长和环境,避免因默认采样差异导致误判。
-benchtime(如 3s)让每组测试跑足够久,减少随机波动-count=5 可跑 5 轮取平均值,用 benchstat 工具分析显著性差异GOGC=off 临时关闭 GC 观察真实分配行为(仅调试用)b.ReportAllocs() 和 b.StopTimer() 精细控制某些场景下,初始化或清理逻辑不应计入指标,这时需要手动控制计时与统计范围。
b.ReportAllocs() 显式开启内存统计(部分旧版本需手动调用)b.StopTimer() 暂停计时和内存统计,适合放预热、建缓存、开连接等准备代码b.StartTimer() 恢复统计,确保只测核心逻辑StopTimer,只对 lookup() 计时