Актуальные тесты реализации Prolog?

Есть ли актуальные тесты реализации Prolog (с результатами)?

Я нашел это на mercury веб-сайта. Удивительно, но здесь показан 20-кратный разрыв между swi -пролог и Водолей. Я подозреваю, что эти результаты довольно старые. Сохраняется ли этот разрыв? Лично я также хотел бы видеть некоторые сравнения с включенной проверкой событий, поскольку она сильно влияет на производительность, и некоторые компиляторы могут быть лучше других при ее оптимизации.

Из более поздних сравнений я обнаружил, что это утверждение, что gnu-prolog в 2 раза быстрее, чем SWI, и YAP в 4 раза быстрее, чем SWI на одной конкретной кодовой базе.


Редактировать:

конкретный случай, когда проверка происходит, необходима для реальной проблемы

Конечно: вывод типа в Haskell, OCaml, Swift или в средствах доказательства теорем, таких как этот. Я также считаю, что на программисте лежит бремя доказывания того, что его код не нуждается в проверке срабатывания. Тесты могут доказать только то, что он вам нужен, а не то, что он вам не нужен.


person bobcat    schedule 20.12.2020    source источник
comment
Боковое примечание: из всех систем Пролога на основе Java, перечисленных в Википедии, ни одна не является компилятором. Это кажется странным, поскольку компилятор Prolog- ›WAM имеет размер 3-5 KLOC, насколько я понимаю, так что это не слишком сложно.   -  person bobcat    schedule 20.12.2020
comment
На основе документации (swi-prolog.org/pldoc/doc_for?object=section (2,% 271.3% 27, swi (% 27 /), пролог SWI не предназначен для абсолютная максимальная производительность. В основном это для дополнительных функций (и исследований).   -  person Willem Van Onsem    schedule 20.12.2020
comment
Но сколько скорости вам нужно? Как обычно для тестов и даже больше для Prolog, лучше всего запрограммировать вашу конкретную проблему, прежде чем запускать сравнения на интересующем вас оборудовании (кто-нибудь ARM?)   -  person David Tonhofer    schedule 20.12.2020
comment
@DavidTonhofer Если вы посмотрите на результаты, они довольно согласованы для 10 различных задач: например nuProlog всего в 2 раза быстрее, чем SWI, но, что интересно, нет ни одной проблемы, где он был бы медленнее.   -  person bobcat    schedule 20.12.2020
comment
@MaxB JVM не является идеальной целью для WAM или WAM-подобной реализации. WAM - это блестящий дизайн с тщательным анализом производительности (помните, он был изобретен, когда компьютеры имели крошечную долю сегодняшней памяти / скорости обработки) и, таким образом, лучше реализован на языках программирования более низкого уровня, таких как C.   -  person Paulo Moura    schedule 20.12.2020
comment
Я проголосовал за него вплотную, потому что не считаю это полезным вопросом. За многие годы использования Prolog у меня никогда не было проблем, если occurs check неактивен. Если вы можете показать конкретный случай, когда occurs check необходим для решения реальной проблемы, которая вам нужна, я бы пересмотрел. Мне нравятся многие из ваших вопросов, но этот может заставить других поверить в то, что occurs check нужен всегда.   -  person Guy Coder    schedule 20.12.2020
comment
Мне нравятся многие из ваших вопросов, но я считаю, что этот следует удалить. Если бы дать какой-то реальный код и спросить, как его можно улучшить при проверке кода, это будет иметь больше смысла.   -  person Guy Coder    schedule 20.12.2020
comment
@PauloMoura Есть ли конкретная инструкция WAM, которую трудно выполнить или скомпилировать в JVM? Насколько я понимаю, WAM требует сборки мусора, которая в JVM уже есть.   -  person bobcat    schedule 20.12.2020
comment
@MaxB Никаких инструкций WAM, но организация памяти WAM, которая позволяет провести ряд умных оптимизаций. См. researchgate.net/publication/   -  person Paulo Moura    schedule 20.12.2020
comment
@MaxB Oracle JVM, например, не выполняет оптимизацию хвостового вызова (если за это время это не изменилось, но я так не думаю). Будучи ориентированными на бизнес, ориентированными на традиции C, дизайнеры, должно быть, думали, что редко встречаются те, кто выполняет (или понимает) рекурсию заранее.   -  person David Tonhofer    schedule 20.12.2020
comment
@DavidTonhofer Существуют языки, которые компилируются в JVM и имеют оптимизацию хвостовой рекурсии: Kotlin и Clojure (взаимная хвостовая рекурсия может быть проблематичной в них)   -  person bobcat    schedule 20.12.2020
comment
@MaxB К сожалению, они этого не делают. Вот почему, например, в Clojure вы не выполняете ванильные рекурсивные вызовы, а используете конструкции цикла, чтобы сообщить компилятору о необходимости создания цикла: повторять. Конечно, от этого не обязательно хуже.   -  person David Tonhofer    schedule 20.12.2020
comment
@DavidTonhofer recur - это просто синтаксический выбор (что-то вроде более явного). В Kotlin или Kawa функция просто ссылается на себя. Трудности правильной оптимизации хвостовых вызовов не остановили пользователей Clojure, BTW.   -  person bobcat    schedule 20.12.2020
comment
Интересно: Производительность SWI-Prolog 8.3.5 по сравнению с YAP 6.5.0 - мне все еще не нравится этот вопрос, но я также считаю, что у вас должна быть какая-либо достоверная информация, чтобы вы могли решить для себя. Больше таких сообщений можно найти на форуме SWI-Prolog.   -  person Guy Coder    schedule 21.12.2020


Ответы (3)


Также существует классический набор тестов Prolog, который можно использовать для сравнения реализаций Prolog. Некоторые системы Prolog включают их (например, SWI-Prolog). Они также включены в дистрибутив Logtalk, что позволяет запускать их с поддерживаемыми серверными модулями:

https://github.com/LogtalkDotOrg/logtalk3/tree/master/examples/bench

В текущей версии Logtalk git вы можете запустить его с серверной частью, которую хотите протестировать, и использовать запросы:

?- {bench(loader)}.
...
?- run.

Они будут запускать каждый тест 1000 раз, сообщается общее время. Используйте run/1 для другого количества повторений. Например, в моей системе macOS с использованием SWI-Prolog 8.3.15 я получаю:

?- run.
boyer: 20.897818 seconds
chat_parser: 7.962188999999999 seconds
crypt: 0.14653999999999812 seconds
derive: 0.004462999999997663 seconds
divide10: 0.002300000000001745 seconds
log10: 0.0011489999999980682 seconds
meta_qsort: 0.2729539999999986 seconds
mu: 0.04534600000000211 seconds
nreverse: 0.016964000000001533 seconds
ops8: 0.0016230000000021505 seconds
poly_10: 1.9540520000000008 seconds
prover: 0.05286200000000463 seconds
qsort: 0.030829000000004214 seconds
queens_8: 2.2245050000000077 seconds
query: 0.11675499999999772 seconds
reducer: 0.00044199999999960937 seconds
sendmore: 3.048624999999994 seconds
serialise: 0.0003770000000073992 seconds
simple_analyzer: 0.8428750000000065 seconds
tak: 5.495768999999996 seconds
times10: 0.0019139999999993051 seconds
unify: 0.11229400000000567 seconds
zebra: 1.595203000000005 seconds
browse: 31.000829000000003 seconds
fast_mu: 0.04102400000000728 seconds
flatten: 0.028527999999994336 seconds
nand: 0.9632950000000022 seconds
perfect: 0.36678499999999303 seconds
true.

Для SICStus Prolog 4.6.0 я получаю:

| ?- run.
boyer: 3.638 seconds
chat_parser: 0.7650000000000006 seconds
crypt: 0.029000000000000803 seconds
derive: 0.0009999999999994458 seconds
divide10: 0.001000000000000334 seconds
log10: 0.0009999999999994458 seconds
meta_qsort: 0.025000000000000355 seconds
mu: 0.004999999999999893 seconds
nreverse: 0.0019999999999997797 seconds
ops8: 0.001000000000000334 seconds
poly_10: 0.20500000000000007 seconds
prover: 0.005999999999999339 seconds
qsort: 0.0030000000000001137 seconds
queens_8: 0.2549999999999999 seconds
query: 0.024999999999999467 seconds
reducer: 0.001000000000000334 seconds
sendmore: 0.6079999999999997 seconds
serialise: 0.0019999999999997797 seconds
simple_analyzer: 0.09299999999999997 seconds
tak: 0.5869999999999997 seconds
times10: 0.001000000000000334 seconds
unify: 0.013000000000000789 seconds
zebra: 0.33999999999999986 seconds
browse: 4.137 seconds
fast_mu: 0.0070000000000014495 seconds
nand: 0.1280000000000001 seconds
perfect: 0.07199999999999918 seconds
yes

Для GNU Prolog 1.4.5 я использую пример сценария внедрения в logtalk3/scripts/embedding/gprolog, чтобы создать исполняемый файл, который включает полностью скомпилированный пример bench:

| ?- run.
boyer: 9.3459999999999983 seconds
chat_parser: 1.9610000000000003 seconds
crypt: 0.048000000000000043 seconds
derive: 0.0020000000000006679 seconds
divide10: 0.00099999999999944578 seconds
log10: 0.00099999999999944578 seconds
meta_qsort: 0.099000000000000199 seconds
mu: 0.012999999999999901 seconds
nreverse: 0.0060000000000002274 seconds
ops8: 0.00099999999999944578 seconds
poly_10: 0.72000000000000064 seconds
prover: 0.016000000000000014 seconds
qsort: 0.0080000000000008953 seconds
queens_8: 0.68599999999999994 seconds
query: 0.041999999999999815 seconds
reducer: 0.0 seconds
sendmore: 1.1070000000000011 seconds
serialise: 0.0060000000000002274 seconds
simple_analyzer: 0.25 seconds
tak: 1.3899999999999988 seconds
times10: 0.0010000000000012221 seconds
unify: 0.089999999999999858 seconds
zebra: 0.63499999999999979 seconds
browse: 10.923999999999999 seconds
fast_mu: 0.015000000000000568 seconds

(27352 ms) yes

Я предлагаю вам попробовать эти тесты, запустив их на своем компьютере, с системами Prolog, которые вы хотите сравнить. При этом помните, что это ограниченный набор тестов, не обязательно отражающих фактическую относительную производительность в нетривиальных приложениях.


Соотношения:

              SICStus/SWI   GNU/SWI

boyer               17.4%     44.7%
browse              13.3%     35.2%
chat_parser          9.6%     24.6%
crypt               19.8%     32.8%
derive              22.4%     44.8%
divide10            43.5%     43.5%
fast_mu             17.1%     36.6%
flatten                 -         -
log10               87.0%     87.0%
meta_qsort           9.2%     36.3%
mu                  11.0%     28.7%
nand                13.3%         -
nreverse            11.8%     35.4%
ops8                61.6%     61.6%
perfect             19.6%         -
poly_10             10.5%     36.8%
prover              11.4%     30.3%
qsort                9.7%     25.9%
queens_8            11.5%     30.8%
query               21.4%     36.0%
reducer            226.2%      0.0%
sendmore            19.9%     36.3%
serialise          530.5%   1591.5%
simple_analyzer     11.0%     29.7%
tak                 10.7%     25.3%
times10             52.2%     52.2%
unify               11.6%     80.1%
zebra               21.3%     39.8%

P.S. Обязательно используйте Logtalk 3.43.0 или новее, поскольку он включает исправления переносимости для примера bench, в том числе для GNU Prolog, и набор базовых модульных тестов.

person Paulo Moura    schedule 20.12.2020
comment
Я редактировал в соотношениях. Надеюсь, ты не против. reducer кажется подозрительным - person bobcat; 20.12.2020

У меня есть результаты тестов, опубликованные по адресу:

https://logtalk.org/performance.html

Однако не забудьте прочитать и понять примечания в конце этой страницы.

Что касается запуска тестов с GNU Prolog, обратите внимание, что вы не можете использовать интерпретатор верхнего уровня, поскольку код, загруженный из него, интерпретируется, а не компилируется (см. Документацию GNU Prolog на gplc). В общем, нередко можно увидеть, как люди запускают тесты из интерпретатора верхнего уровня, забывая, что означает слово интерпретатор, и публикуют фальшивую статистику, в которой шаги компиляции / расширения термина / ... ошибочно заканчиваются. смешанный с тем, что должно быть протестировано.

person Paulo Moura    schedule 20.12.2020
comment
SICStus / SWI ≈ 6, для статического кода, похожего на старый тест? - person bobcat; 20.12.2020
comment
@MaxB См. Мой альтернативный ответ. - person Paulo Moura; 20.12.2020

Я наткнулся на это сравнение с 2008 года в архиве интернета:

https://web.archive.org/web/20100227050426/http://www.probp.com/performance.htm

введите описание изображения здесь

person bobcat    schedule 20.12.2020
comment
Множество изменений в этих системах с 2008 года ... - person Paulo Moura; 20.12.2020
comment
@PauloMoura Другая опасность классических тестов (в любом сообществе) заключается в том, что разработчики компиляторов оптимизируют специально для них. - person bobcat; 20.12.2020
comment
Как-то смутно припоминаю это сравнение. В частности, GNU Prolog используется только в версии интерпретатора. Не версия компилятора. - person false; 06.02.2021