scala concurrency clojure actor agents

¿Cómo se comparan los agentes de Clojure con los actores de Scala?



concurrency agents (1)

Escribí una simulación de la topología de la red de anillo en Scala ( fuente aquí ) (Scala 2.8 RC7) y Clojure ( fuente aquí ) (Clojure 1.1) para una comparación de Actores y Agentes.

Si bien la versión de Scala muestra una tasa de intercambio de mensajes casi constante a medida que incremento 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. También durante una única ejecución, la tasa de mensajes en la versión Clojure disminuye a medida que pasa el tiempo.

Entonces, ¿tengo curiosidad acerca de cómo los Actores de Scala se comparan con los Agentes de Clojure? ¿Los agentes son intrínsecamente menos concurrentes que los actores o el código está escrito de manera ineficiente (autoboxing)?

PD: noté que el uso de la 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 el Clojure utiliza mucha menos memoria (~ 100 MB para 1 millón de nodos).

Editar:

Ambas versiones se ejecutan en la misma JVM con todos los argumentos de JVM y los parámetros de configuración de Actor y Agente establecidos por defecto. En mi máquina, la versión de Scala da una tasa de mensajes de alrededor de 5000 mensajes / seg de manera consistente para 100 a 1 millón de nodos, mientras que la versión Clojure comienza con 60000 mensajes / seg para 100 nodos, que disminuye a 200 mensajes / seg para 1 millón de nodos.

Editar 2

Resulta que mi versión de Clojure fue ineficientemente escrita. Cambié el tipo de colección de nodes de la 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 Scala. He actualizado las fuentes enlazadas también.


[Descargo de responsabilidad: estoy en el equipo Akka]

Un agente de Clojure es una bestia diferente de un actor de Scala, especialmente si piensas en quién 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, configuraciones razonables para Actores frente a configuraciones sensibles para Agentes, o están sintonizadas por separado?

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

Sería interesante ver cuál es el resultado comparado con su prueba de Clojure en su máquina.