Проблемы с прологом
Я хотел бы найти способ профилировать использование памяти предикатом (огромным), который я написал в прологе. В настоящее время я запускаю его с помощью swi и yap, и из этих процессов видно, что выделяется большой кусок памяти.
Проблема в том, что он не освобождается / освобождается / собирается мусором, когда предикат завершается (мне нужно остановить интерпретатор, чтобы увидеть его обратно), плюс объем памяти продолжает расти только во время работы предиката (а где нет, так как tail Оптимизация рекурсии должна смягчать проблему, я думаю, на каждой итерации).
Есть ли способ определить субпредикат / вызов, который увеличивает используемую память, и проверить, эффективно ли вызывается оптимизация хвостовой рекурсии?
Любые другие предложения о том, как оптимизировать проблему, будут очень благодарны. Я дам более подробную информацию о том, что делает предикат, если это необходимо.
1 ответ
В SWI-Prolog, один простой способ узнать, действительно ли ваш рекурсивный предикат получает хвостовую оптимизацию, использует prolog_current_frame
( смотрите здесь):
foo :-
prolog_current_frame(F), format('~d~n',[F]),
do_something,
foo.
Если была выполнена хвостовая оптимизация, она будет возвращать одно и то же целое число каждый раз, когда вы вводите свой предикат с помощью рекурсивного вызова. У меня была проблема, что я не понимаю, что предикат, который я использую, создает точки выбора и предотвращает оптимизацию хвоста.
Если никакая оптимизация хвоста не является реальной проблемой, то вы могли бы просто сделать разрез перед рекурсивным вызовом:
foo :-
do_something,
!, foo.
Это удалит все точки выбора, созданные do_something
, Если ваша память все еще растет, проблема может быть в другом месте. Ваш предикат создает большую структуру данных? или используя много промежуточных списков?