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