Насколько агенты Clojure сравниваются с актерами Scala?

Я написал симуляцию кольцевой топологии сети на Scala (источник здесь) (Scala 2.8 RC7) и Clojure (источник здесь) (Clojure 1.1) для сравнения участников и агентов.

В то время как версия Scala показывает почти постоянную скорость обмена сообщениями, когда я увеличиваю количество узлов в сети со 100 до 1000000, версия Clojure показывает скорость обмена сообщениями, которая уменьшается с увеличением количества узлов. Также во время одного запуска частота сообщений в версии Clojure уменьшается с течением времени.

Так что мне любопытно, как Актеры Scala сравниваются с Агентами Clojure? Агенты по своей природе менее параллельны, чем Актеры, или код написан неэффективно (автобокс?)?

PS: Я заметил, что использование памяти в версии Scala сильно увеличивается с увеличением количества узлов (> 500 МБ для 1 миллиона узлов), в то время как Clojure использует гораздо меньше памяти (~ 100 МБ для 1 миллиона узлов).

Изменить:

Обе версии работают на одной JVM со всеми аргументами JVM и параметрами конфигурации Actor и Agent, установленными по умолчанию. На моей машине версия Scala дает скорость передачи сообщений около 5000 сообщений в секунду для 100–1 миллиона узлов, тогда как версия Clojure начинается с 60000 сообщений в секунду для 100 узлов, которая уменьшается до 200 сообщений в секунду для 1 миллиона узлов.

Изменить 2

Оказалось, что моя версия Clojure была написана неэффективно. Я изменил тип коллекции nodes с list на vector, и теперь она показывает последовательное поведение: 100000 сообщений в секунду для 100 узлов и 80000 сообщений в секунду для 100000 узлов. Таким образом, агенты Clojure кажутся быстрее, чем актеры Scala. Я также обновил связанные источники.


person Abhinav Sarkar    schedule 15.07.2010    source источник
comment
Есть способ сделать актор Scala беспоточным. Я мало что знаю о Clojure, но было бы неплохо, если бы вы разместили (соответствующие части) свой исходный код.   -  person André Laszlo    schedule 16.07.2010
comment
Он дал ссылку на источник для обеих версий.   -  person Magnus    schedule 16.07.2010
comment
В своем Edit 2 вы, наверное, имеете в виду inefficiently?   -  person ponzao    schedule 16.07.2010
comment
Я не знаю Scala, поэтому единственное, что я могу здесь сказать, это то, что есть два Acters: один (ведьма не масштабируется до хорошего) - это один актер на поток, а другой - на основе событий, так что, возможно, это способ улучшить ваш код Scala ? Единственное, что я могу сказать об Агентах, это то, что угрозы используются из пула потоков. Я был бы заинтригован здесь ответом эксперта. Может быть, спросите о группах Clojure и Scala.   -  person nickik    schedule 16.07.2010
comment
@nickik, здесь я использовал тип, основанный на событиях.   -  person Abhinav Sarkar    schedule 16.07.2010
comment
См. Реализацию эталонного теста в Akka, упомянутую Виктором, есть одна реализация Akka и одна стандартная реализация актора Scala.   -  person oluies    schedule 16.07.2010
comment
в редактировании 2 вы говорите об использовании 100 000 узлов, но изначально указали, что для scala используются узлы 1e6. это опечатка? просто любопытно, потому что вы сообщаете, что clojure работает быстрее, чем scala. просто любопытно   -  person scape    schedule 13.05.2013


Ответы (1)


[Отказ от ответственности: я в команде Akka]

Агент Clojure отличается от актера Scala, особенно если задуматься о том, кто контролирует его поведение. В Агентах поведение определяется снаружи и передается Агенту, а в Актерах поведение определяется внутри Актера.

Не зная ничего о вашем коде, я действительно не могу многого сказать, используете ли вы те же параметры JVM, разогреваете те же самые разумные настройки для Актеров по сравнению с разумными настройками для Агентов, или они настраиваются отдельно?

В качестве примечания: Akka имеет реализацию кольцевой скамьи, расположенной здесь: http://github.com/jboner/akka-bench/tree/master/ring/

Было бы интересно посмотреть, каков результат по сравнению с вашим тестом Clojure на вашей машине.

person Viktor Klang    schedule 15.07.2010
comment
Сейчас ему почти три года :) Было бы очень интересно увидеть обновление сейчас, когда clojure около версии 1.5.1, а scala - около 2.10.1 - person Reb.Cabin; 12.04.2013
comment
@ Reb.Cabin из интереса Я обновил код для работы в последних версиях Scala (2.11.2), Akka (2.3.5) и Clojure (1.6.0). Я получаю аналогичные результаты для Clojure (~ 80 тыс. Сообщений / сек для узлов от 1 до 100 тыс.), Но гораздо лучшая производительность у Scala (+ 1 млн сообщений / сек для 10 млн узлов). Вероятно, этого следовало ожидать, поскольку команда Akka будет активно оптимизировать пропускную способность сообщений, в то время как решение Clojure является более универсальным. - person RoryD; 26.08.2014