Я написал симуляцию кольцевой топологии сети на 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. Я также обновил связанные источники.
Edit 2
вы, наверное, имеете в видуinefficiently
? - person ponzao   schedule 16.07.2010