Я впервые ковырялся в Macro Stepper и заметил, что for/list
расширен в код, включающий в себя нечто, называемое alt-reverse
.for/list
выводит каждый элемент в начало пустого списка и затем переворачивает его?Это кажется очень неэффективным.
Я написал небольшой тест:
(define (test n)
(time
(for/list ([x (in-range n)])
(list x x)))
(time
(for/fold ([result '()])
([x (in-range n)])
(cons (list x x) result)))
(void))
Действительно, версия for/list
работает примерно в 150% случаев for/fold
без reverse
,разница, по-видимому, полностью связана с дополнительной сборкой мусора:
> (test 500000)
cpu time: 1059 real time: 2079 gc time: 940
cpu time: 614 real time: 1231 gc time: 550
> (test 500000)
cpu time: 1060 real time: 3889 gc time: 907
cpu time: 770 real time: 1363 gc time: 699
> (test 500000)
cpu time: 1035 real time: 2479 gc time: 917
cpu time: 736 real time: 2535 gc time: 651
Похоже, я не должен привыкать звонить for/list
.Есть ли более эффективный способ составить список в «прямом» порядке (т. Е. Где последний оцененный элемент является последним в списке)?