【发布时间】:2019-01-31 11:40:03
【问题描述】:
我写了一个benchmark来测试两个斐波那契数生成器的速度,源码是here on github。
func BenchmarkFib(b *testing.B) {
fibFuncs := []struct {
name string
f func(int) int
}{
{"recursive", fibRecu},
{"iterative", fibIter},
}
for _, fibFunc := range fibFuncs {
// calculate k'th Fibonacci number
for k := 10; k < 1001; k *= 10 {
b.Run(fmt.Sprintf("%s Fib %v", fibFunc.name, k), func(b *testing.B) {
for n := 0; n < b.N; n++ {
// b.StopTimer()
// reset the memo
memo = map[int]int{0: 0, 1: 1, 2: 1}
// b.StartTimer()
fibFunc.f(k)
}
})
}
}
}
事实上,基准测试有效,输出为
nos (master) fibonacci $ go test -bench .
goos: linux
goarch: amd64
pkg: github.com/nosarthur/dynamicP/fibonacci
BenchmarkFib/recursive_Fib_10-4 1000000 1256 ns/op
BenchmarkFib/recursive_Fib_100-4 100000 18256 ns/op
BenchmarkFib/recursive_Fib_1000-4 10000 206109 ns/op
BenchmarkFib/iterative_Fib_10-4 10000000 218 ns/op
BenchmarkFib/iterative_Fib_100-4 5000000 292 ns/op
BenchmarkFib/iterative_Fib_1000-4 2000000 881 ns/op
PASS
ok github.com/nosarthur/dynamicP/fibonacci 12.208s
但是,我添加了b.StopTime() 和b.StartTime() 以排除重置备忘录的时间。这两行未注释,基准挂起,部分输出为
nos (master *) fibonacci $ go test -bench .
goos: linux
goarch: amd64
pkg: github.com/nosarthur/dynamicP/fibonacci
BenchmarkFib/recursive_Fib_10-4 1000000 2139 ns/op
BenchmarkFib/recursive_Fib_100-4 100000 24775 ns/op
BenchmarkFib/recursive_Fib_1000-4 5000 239197 ns/op
BenchmarkFib/iterative_Fib_10-4 ^Csignal: interrupt
FAIL github.com/nosarthur/dynamicP/fibonacci 269.067s
排除备忘录重置的正确方法是什么?我的 go 版本是 1.10.1
【问题讨论】:
-
您的代码不正确。你说
The 93'th Fibonacci number is : -6246583658587674878.Overflow! -
不确定,但 b.Run 之外的 k 循环看起来很可疑。
标签: testing go benchmarking