Что происходит, так это то, что ваши функции действительно быстрые, особенно в случае итеративной функции, и сброс вашей карты (а также сами функции StartTimer
и StopTimer
со статистикой времени выполнения распределение) намного, намного медленнее.
Итак, что происходит, когда вы вызываете StopTimer
, он устанавливает внутреннюю отслеживаемую продолжительность теста только на время, необходимое для запуска функции. Хорошо, угадайте, как он оценивает, сколько итераций нужно выполнить в течение установленного контрольного времени? Да, вы уже догадались - внутренняя продолжительность.
Таким образом, для выполнения вашей итеративной функции требуется около 10 нс, для сброса карты требуется около 250 нс, а для функций таймера требуется значительно больше времени, но, согласно оценкам, каждый прогон занимает всего 20 нс и соответственно устанавливает количество итераций.
Мое предложение - в этом случае не используйте функции StartTimer/StopTimer
, а просто добавьте в свои тесты третий прогон, который не работает - в основном:
{"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