Я написал симуляцию Кольцевой топологии сети в 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. Я также обновил связанные источники.