Как я могу определить, правильно ли оптимизирована моя хвостовая рекурсивная функция - PullRequest
1 голос
/ 17 ноября 2010

У меня есть функция Scheme, базовая форма которой выглядит следующим образом

(define (foo param var)  
  (cond ((end-condition) (return-something))  
        ((other-end-condit) (return-something-else))  
        (else  
         (let ((newvar (if some-condition   
                           (make-some-updated var)  
                           (destructive-update! var))))  
           (foo param newvar)))))  

Я чувствую, что это довольно явно то, что нужно оптимизировать для итерации при компиляции, но когда я компилирую это (с курицей), оно все равно работает невероятно медленно. (если я понимаю спецификации R5RS: http://groups.csail.mit.edu/mac/ftpdir/scheme-reports/r5rs-html.old/r5rs_22.html, похоже, что это должно работать)

Я написал точно такой же алгоритм с циклом while в python, и интерпретируемая программа завершилась за считанные секунды. Моя скомпилированная схема занимает около 15 минут, и я уверен, что алгоритм такой же.

Я думаю, что это хвостовая рекурсия, не получившая оптимизированной проблемы, поскольку я не могу думать, что еще это могло бы быть, но я не могу понять это. Есть идеи? Для чего бы то ни было, var - это хеш, а деструктивное обновление просто добавляет элемент, хотя он также возвращает обновленный хеш, который будет передан как newvar.

1 Ответ

4 голосов
/ 17 ноября 2010

Эта функция действительно рекурсивна, так что вам там хорошо. Однако хвостовая рекурсия просто означает, что пространство стека не будет расти, а не то, что ваша программа гарантированно будет работать быстро. Если вы хотите увидеть, действительно ли ваша программа выполняется хвостово-рекурсивно, запустите ее, наблюдая за общим объемом памяти, занятым Chicken (и убедитесь, что вы не выделяете память в make-some-updated, что может быть). Если память увеличивается, то Chicken неправильно компилирует вашу программу в соответствии со стандартом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...