Testing 如何在golang benchmark中正确启动时间和停止时间?

Testing 如何在golang benchmark中正确启动时间和停止时间?,testing,go,benchmarking,Testing,Go,Benchmarking,我编写了一个基准测试来测试两个斐波那契数生成器的速度,源代码是 但是,我添加了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

我编写了一个基准测试来测试两个斐波那契数生成器的速度,源代码是

但是,我添加了
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

发生的事情是,你的函数确实很快,特别是在迭代函数的情况下,你的映射重置(以及
StartTimer
StopTimer
函数本身以及运行时stat分配)要慢得多

因此,当您调用
StopTimer
时,它将基准测试的内部跟踪持续时间设置为仅运行函数所需的时间。猜猜它是如何估计在指定的基准时间内要运行多少次迭代的?是的,你猜对了——内部持续时间

因此,基本上,迭代函数运行大约需要10ns,映射重置大约需要250ns,计时器函数需要相当长的时间-但是基准测试估计每次运行只需要20ns,并相应地设置迭代次数

我的建议-在这种情况下不要使用
StartTimer/StopTimer
函数,只需在测试中添加第三次非op运行即可——基本上:

{"baseline", func(int) int {return 0}},
然后,只需从其他两个集合中减去此函数的时间,就可以估计分配与函数本身的ns/op数量

以下是我运行此操作时的结果:

BenchmarkFib/baseline_Fib_10-2           5000000           357 ns/op
BenchmarkFib/baseline_Fib_100-2          5000000           327 ns/op
BenchmarkFib/baseline_Fib_1000-2         5000000           310 ns/op
BenchmarkFib/recursive_Fib_10-2          1000000          1659 ns/op
BenchmarkFib/recursive_Fib_100-2           50000         24898 ns/op
BenchmarkFib/recursive_Fib_1000-2           5000        301771 ns/op
BenchmarkFib/iterative_Fib_10-2          5000000           333 ns/op
BenchmarkFib/iterative_Fib_100-2         3000000           394 ns/op
BenchmarkFib/iterative_Fib_1000-2        1000000          1052 ns/op
PASS
ok      _/tmp/dynamicP/fibonacci    15.305s

您的代码不正确。你说
第93个斐波那契数是:-6246583658587674878。
溢出!不确定,但b.Run外的k循环看起来可疑。
{"baseline", func(int) int {return 0}},
BenchmarkFib/baseline_Fib_10-2           5000000           357 ns/op
BenchmarkFib/baseline_Fib_100-2          5000000           327 ns/op
BenchmarkFib/baseline_Fib_1000-2         5000000           310 ns/op
BenchmarkFib/recursive_Fib_10-2          1000000          1659 ns/op
BenchmarkFib/recursive_Fib_100-2           50000         24898 ns/op
BenchmarkFib/recursive_Fib_1000-2           5000        301771 ns/op
BenchmarkFib/iterative_Fib_10-2          5000000           333 ns/op
BenchmarkFib/iterative_Fib_100-2         3000000           394 ns/op
BenchmarkFib/iterative_Fib_1000-2        1000000          1052 ns/op
PASS
ok      _/tmp/dynamicP/fibonacci    15.305s