Как агенты Clojure сравниваются с актерами Скалы? - PullRequest
27 голосов
/ 15 июля 2010

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

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

Итак, мне любопытно, как актеры Скалы сравнивают с агентами Клоюра? Агенты по своей сути менее параллельны, чем Actors, или код написан неэффективно (автобокс?)?

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

Edit:

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

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

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

1 Ответ

28 голосов
/ 16 июля 2010

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

Агент Clojure - это зверь, отличающийся от актера Скала, особенно если вы думаете о том, кто контролирует поведение. В агентах поведение определяется снаружи и передается агенту, а в субъектах поведение определяется внутри субъекта.

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

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

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

...