способами
https://leetcode.com/problems/print-immutable-linked-list-in-reverse/
Среди возможных решений, есть элегантное использование defer
https://leetcode.com/problems/print-immutable-linked-list-in-reverse/discuss/915629/Go-Solution(with-stacking-defer)
Вчера полдня гуглил как это работает, в итоге решил это все замерить (сравнить рекурсию, defer, и итерацию)
https://gist.github.com/chistopat/dc7643406b4f43802560cdddd378ccd7
Алгоритмически сложность одинаковая O(n) по времени и по памяти, а вот константы разные
cpu: Intel(R) Core(TM) i7-1068NG7 CPU @ 2.30GHz
BenchmarkDefer-8 1 9081355583 ns/op 2080055904 B/op 40000023 allocs/op
BenchmarkRecursive-8 1 2918702055 ns/op 86640 B/op 16 allocs/op
BenchmarkIterative-8 1 3159048507 ns/op 961721624 B/op 56 allocs/op
BenchmarkIterativePreAllocate-8 1 1189382680 ns/op 160006144 B/op 1 allocs/op
Ожидаемо, что итерация с заранее аллоцированным слайсом самая быстрая
Но, кто может объяснить, откуда берутся 40млн (миллионов, Карл!) аллокаций при использовании defer в цикле?
Может я бенчмарк неправильно написал?
странно, закрыт доступ
Обсуждают сегодня