【发布时间】:2016-06-27 00:53:47
【问题描述】:
我正在对具有不同列表大小(大小 S 的列表)的代码进行基准测试 Go 基准测试显示 ns/op,但我想要的是 (ns/op)/S。
也就是说go test -bench=.的输出是:
BenchmarkMy10-4 100000000 15.7 ns/op
BenchmarkMy20-4 50000000 33.8 ns/op
BenchmarkMy30-4 30000000 43.8 ns/op
BenchmarkMy40-4 30000000 49.3 ns/op
BenchmarkMy50-4 30000000 56.6 ns/op
BenchmarkMy1000-4 2000000 686 ns/op
BenchmarkMy10000-4 200000 6685 ns/op
BenchmarkMy100000-4 20000 65425 ns/op
“My10”中的“10”表示 10 个项目的列表 (S=10)。
虽然了解不同列表大小的 ns/op 很有用,但我还想知道 ns/op/S(列表中每个项目的时间)。
现在我将结果粘贴到电子表格中并在那里进行数学运算。但是我想让“去测试”为我输出这些信息。
我的 main_test.go 文件如下所示:
import "testing"
var result int
func benchmarkMy(i int, b *testing.B) {
var r int
mylist := MakeList(i)
b.ResetTimer()
for n := 0; n < b.N; n++ {
r = My(mylist)
}
result = r
}
func BenchmarkMy10(b *testing.B) { benchmarkMy(10, b) }
func BenchmarkMy20(b *testing.B) { benchmarkMy(20, b) }
func BenchmarkMy30(b *testing.B) { benchmarkMy(30, b) }
func BenchmarkMy40(b *testing.B) { benchmarkMy(40, b) }
func BenchmarkMy50(b *testing.B) { benchmarkMy(50, b) }
func BenchmarkMy1000(b *testing.B) { benchmarkMy(1000, b) }
func BenchmarkMy10000(b *testing.B) { benchmarkMy(10000, b) }
func BenchmarkMy100000(b *testing.B) { benchmarkMy(100000, b) }
似乎 test.BenchmarkResult 结构有我需要的信息,但我不知道如何使用这个结构。
【问题讨论】:
-
不,标准基准无法做到这一点,因为它通常没有用处。 ns/op/S 对于仅 O(1) 的算法可能很有趣。
-
@Volker 为什么输出自定义结果没有用,即跟踪其他值?如果有人想测量压缩比怎么办?
-
@kravemir 从 Go 1.13 开始,您可以报告自定义指标,但这用途有限,而且您的压缩比示例看起来很奇怪(除非我们谈论的是随机算法) .
标签: go benchmarking