Я сделал следующую небольшую программу, чтобы определить, используется ли память для таких целей, как freeze(X,Goal)
восстанавливается, когда X
становится недоступным:
%:- use_module(library(freeze)). % Ciao Prolog needs this
freeze_many([],[]).
freeze_many([_|Xs],[V|Vs]) :-
freeze(V,throw(error(uninstantiation_error(V),big_freeze_test/3))),
freeze_many(Xs,Vs).
big_freeze_test(N0,N,Zs0) :-
( N0 > N
-> true
; freeze_many(Zs0,Zs1),
N1 is N0+1,
big_freeze_test(N1,N,Zs1)
).
Запустим следующий запрос ...
?- statistics, length(Zs,1000), big_freeze_test(1,500,Zs), statistics.
... с разными процессорами Prolog и посмотрите на потребление памяти. Какая разница!
(AMD64) SICStus Prolog 4.3.2 : global stack in use = 108 MB (AMD64) B-Prolog 8.1 : stack+heap in use = 145 MB (i386) Ciao Prolog 1.14.2: global stack in use = 36 MB (~72 MB w/AMD64) (AMD64) SWI-Prolog 7.3.1 : global stack in use = 0.5 MB (AMD64) YAProlog 6.2.2 : global stack in use = 16 MB
Выполняя больше итераций с ?- length(Zs,1000), big_freeze_test(1,10000,Zs).
, я сделал следующие наблюдения:
Ciao Prolog сообщает
{ERROR: Memory allocation failed [in Realloc()]}
перед прерыванием.sicstus-prolog и b-prolog выделить все больше и больше, пока машина замирает.
- swi-prolog выполняет все итерации в 3,554 секунды.
- yap также выполняет все итерации, но требует 36,910 секунды.
Есть идеи, почему он работает с SWI-Prolog и YAProlog, но не с другими?
Учитывая время выполнения, почему SWI-Prolog превосходит YAProlog более чем на порядок?
Моя интуиция склоняется к взаимодействию «приписываемых переменных» с «сборкой мусора». SWI-Prolog и YAProlog имеют (разделяют?) API и реализацию переменных с атрибутами, отличные от других процессоров Prolog ... и, опять же, это может быть что-то совершенно другое. Спасибо!
freeze/2
не является ни типичным, ни образцом, а скорее отчаянной мерой, используемой как последнее средство: грязный хакер, который в некоторых случаях упрощает реализацию замороженной цели намного. .. Вероятно, лучше не будет влиять на внутреннюю реализацию или конструкцию механизма подвески. - person repeat   schedule 26.02.2016freeze/2
- это действительно путь ограничений. Слишком сыро, чтобы его можно было надежно использовать. - person false   schedule 26.02.2016garbage_collect
передstatistics
. SWI-Prolog довольно агрессивно вызывает сборщик мусора, в то время как другие системы предпочитают расширять стеки. Расширение стека часто происходит быстрее, но требует больше памяти, что особенно болезненно, если у вас много потоков. Масштабируемость потоков - это фокус для SWI-Prolog. - person Jan Wielemaker   schedule 09.11.2018