Я написал симуляцию кольцевой топологии сети в Scala (источник здесь) (Scala 2.8 RC7) и Clojure (источник здесь) (Clojure 1.1) для сравнение Актеров и Агентов.
В то время как версия Scala показывает почти постоянный обменный курс обмена сообщениями, поскольку я увеличиваю количество узлов в сети от 100 до 1000000, версия Clojure показывает скорости сообщений, которые уменьшаются с увеличением количества узлов. Также во время одного прогона скорость передачи сообщений в версии Clojure уменьшается с течением времени.
Итак, мне интересно, как актеры Scala сравниваются с Clojure Агентами? Являются ли агенты по своей природе менее параллельными, чем акторы, или код неэффективно написан (автобоксинг?)?
PS: Я заметил, что использование памяти в версии Scala значительно увеличивается с увеличением количества узлов ( > 500 МБ для 1 миллиона узлов), тогда как Clojure использует гораздо меньше памяти (~ 100 MB для 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 Актеры. Я также обновил связанные источники.