Go性能对比测试需用testing包的Benchmark函数,函数名以Benchmark开头、参数为*testing.B、循环执行b.N次并用b.ResetTimer()排除初始化开销。

在 Go 中进行性能对比测试,核心是使用 testing 包提供的基准测试(Benchmark)功能。它能准确测量函数执行时间、内存分配等指标,帮助你客观比较不同实现方式的性能差异。
基准测试函数必须满足以下要求:
Benchmark 开头,后接大驼峰命名(如 BenchmarkMapLookup)*testing.B
b.N 次(Go 自动调整次数以保证测试时长稳定)b.ResetTimer() 排除准备开销示例:对比切片遍历与 map 查找
func BenchmarkSliceSearch(b *testing.B) {
data := []int{1, 2, 3, ..., 1000}
target := 999
b.ResetTimer()
for i := 0; i < b.N; i++ {
found := false
for _, v := range data {
if v == target {
found = true
break
}
}
// 避免编译器优化掉整个循环
if !found {
b.Fatal("not found")
}
}
}
<p>func BenchmarkMapLookup(b *testing.B) {
data := make(map[int]bool)
for i := 1; i <= 1000; i++ {
data[i] = true
}
target := 999
b.ResetTimer()
for i := 0; i < b.N; i++ {
if !data[target] {
b.Fatal("not found")
}
}
}使用命令运行基准测试:
立即学习“go语言免费学习笔记(深入)”;
go test -bench=^Benchmark.*$ -benchmem -count=3
-bench=^Benchmark.*$:正则匹配所有 Benchmark 函数-benchmem:显示每次操作的内存分配次数和字节数-count=3:重复运行 3 次取平均值,减少抖动影响输出示例:
BenchmarkSliceSearch-8 1000000 1245 ns/op 0 B/op 0 allocs/op BenchmarkMapLookup-8 20000000 62.3 ns/op 0 B/op 0 allocs/op
关键字段含义:
1000000:本次运行执行了约 100 万次1245 ns/op:每次操作平均耗时 1245 纳秒0 B/op:每次操作分配 0 字节内存0 allocs/op:每次操作无堆内存分配(对 GC 压力小)确保对比公平,需注意:
init() 或 func init() 中预生成)blackhole 防止被优化掉(Go 1.21+ 可用 testing.BenchmarkResult 辅助验证)-count 多次运行可缓解手动比对多次运行结果易出错。推荐用官方工具 benchstat 统计分析:
go install golang.org/x/perf/cmd/benchstat@latest <h1>分别保存两组结果</h1><p>go test -bench=^Benchmark.*$ -benchmem -count=5 > old.txt</p><h1>修改代码后</h1><p>go test -bench=^Benchmark.*$ -benchmem -count=5 > new.txt</p><p>benchstat old.txt new.txt
输出会标明性能提升/下降百分比及 p 值,判断差异是否具有统计显著性(例如 Δ = -85.27% (p=0.000) 表示新方案快约 6.8 倍且高度可信)。
以上就是如何使用Golang实现性能对比测试_Benchmark不同实现方式的详细内容,更多请关注php中文网其它相关文章!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号