2010-07-15 13 views
25

Escribí una simulación de Ring network topology en Scala (source here) (Scala 2.8 RC7) y Clojure (source here) (Clojure 1.1) para una comparación de actores y agentes.¿Cómo se comparan los agentes de Clojure con los actores de Scala?

Mientras que la versión de Scala muestra un tipo de cambio de mensaje casi constante ya que aumento el número de nodos en la red de 100 a 1000000, la versión de Clojure muestra tasas de mensajes que disminuyen con el aumento en el número de nodos. Además, durante una sola ejecución, la tasa de mensajes en la versión de Clojure disminuye a medida que pasa el tiempo.

Tengo curiosidad acerca de cómo los actores de Scala se comparan con los de Clojure's Agents? ¿Los agentes son inherentemente menos concurrentes que los actores o el código está escrito de manera ineficaz (autoboxing?)?

PD: Noté que el uso de memoria en la versión de Scala aumenta mucho con el aumento en el número de nodos (> 500 MB para 1 millón de nodos) mientras que Clojure uno usa mucha menos memoria (~ 100 MB para 1 millones de nodos).

Editar:

Tanto las versiones están ejecutando en el mismo JVM con todos los argumentos de JVM y el actor y parámetros de configuración del Agente establecidas por defecto. En mi máquina, la versión de Scala da una velocidad de mensaje de alrededor de 5000 mensajes por segundo para 100 a 1 millón de nodos, mientras que la versión Clojure comienza con 60000 mensajes por segundo para 100 nodos, que disminuye a 200 mensajes por segundo para 1 millón de nodos.

Editar 2

Resulta que mi versión Clojure fue escrito de manera ineficiente. Cambié el tipo de colección nodes de list a vector y ahora muestra un comportamiento consistente: 100000 mensajes/seg para 100 nodos y 80000 mensajes/seg para 100000 nodos. Así que los agentes de Clojure parecen ser más rápidos que los actores de Scala. También actualicé las fuentes vinculadas.

+0

Hay una manera de hacer que un actor de Scala "sin rosca". No sé mucho sobre Clojure, pero estaría bien si publicaras (partes relevantes de) tu código fuente. –

+0

Se vinculó a la fuente de ambas versiones. – Magnus

+0

En su 'Editar 2', ¿usted probablemente quiere decir 'ineficazmente'? – ponzao

Respuesta

28

[Negación: Estoy en el equipo de Akka]

Un agente Clojure es una bestia diferente de un actor de Scala, sobre todo si se piensa que controla el comportamiento. En Agentes, el comportamiento se define fuera y se envía al Agente, y en Actores el comportamiento se define dentro del Actor.

Sin saber nada acerca de su código Realmente no puedo decir mucho, ¿está usando los mismos parámetros de JVM, calentando las cosas de la misma manera, ajustes razonables para Actores contra configuraciones sensatas para Agentes, o están sintonizados por separado?

Como nota al margen: Akka tiene una implementación del banco de anillo que se encuentra aquí: http://github.com/jboner/akka-bench/tree/master/ring/

sería interesante ver lo que el resultado se compara con la prueba de Clojure en su máquina.

+7

Esto es casi tres años, ahora :) Sería muy interesante ver una actualización ahora que clojure está alrededor de la versión 1.5.1 y Scala está alrededor de 2.10.1 –

+2

@ Reb.Cabin fuera de interés He actualizado el código para correr en las últimas versiones de Scala (2.11.2), Akka (2.3.5) y Clojure (1.6.0). Obtengo resultados similares para Clojure (~ 80K msg/seg para nodos de 1K a 100K), pero un rendimiento mucho mejor de Scala (+ 1M msg/seg para nodos de 10M). Esto es probablemente de esperar ya que el equipo de Akka estaría optimizando activamente el rendimiento de los mensajes, mientras que la solución de Clojure tiene un propósito más general. – RoryD

Cuestiones relacionadas