2010-07-15 13 views
25

Ho scritto una simulazione dello Ring network topology in Scala (source here) (Scala 2.8 RC7) e Clojure (source here) (Clojure 1.1) per un confronto tra attori e agenti.Come gli agenti di Clojure si confrontano con gli attori di Scala?

Mentre la versione di Scala mostra un tasso di cambio quasi costante mentre aumento il numero di nodi nella rete da 100 a 1000000, la versione Clojure mostra tassi di messaggi che diminuiscono con l'aumento del numero di nodi. Inoltre, durante una singola esecuzione, la velocità dei messaggi nella versione Clojure diminuisce con il passare del tempo.

Quindi sono curioso di sapere come gli attori della Scala si confrontano con gli agenti di Clojure? Gli agenti sono intrinsecamente meno concomitanti degli attori o il codice è scritto in modo inefficiente (autoboxing?)?

PS: ho notato che l'utilizzo della memoria nella versione di Scala aumenta molto con l'aumento del numero di nodi (> 500 MB per 1 milione di nodi) mentre quello di Clojure utilizza molta meno memoria (~ 100 MB per 1 milioni di nodi).

Edit:

Entrambe le versioni sono in esecuzione sulla stessa JVM con tutti i args JVM e attore e parametri di configurazione dell'agente impostati come default. Sulla mia macchina, la versione di Scala dà una velocità di messaggio di circa 5000 messaggi/sec in modo coerente per 100 a 1 milione di nodi, mentre la versione Clojure inizia con 60000 messaggi/sec per 100 nodi che diminuisce a 200 messaggi/sec per 1 milione di nodi.

Edit 2

scopre che la mia versione Clojure è stato inefficiente scritto. Ho cambiato il tipo di collezione nodes da list a vector e ora mostra un comportamento coerente: 100.000 messaggi/sec per 100 nodi e 80000 messaggi/sec per 100000 nodi. Quindi gli agenti Clojure sembrano essere più veloci degli attori alla Scala. Ho aggiornato anche le fonti collegate.

+0

C'è un modo per rendere un attore alla Scala "senza fili". Non so molto di Clojure, ma sarebbe bello se tu pubblicassi (parti rilevanti del tuo codice sorgente). –

+0

È collegato al codice sorgente per entrambe le versioni. – Magnus

+0

In "Modifica 2" probabilmente si intende "inefficiente"? – ponzao

risposta

28

[Disclaimer: io sono nella squadra di Akka]

Un Clojure agente è una bestia diversa da un attore di Scala, in particolare se si pensa a chi controlla il comportamento. Negli agenti il ​​comportamento è definito all'esterno e viene inviato all'agente e in attori il comportamento è definito all'interno dell'attore.

Senza sapere nulla del tuo codice non posso davvero dire molto, stai usando gli stessi parametri JVM, riscaldando le stesse impostazioni sensate per gli attori rispetto alle impostazioni sensibili per gli agenti, o sono sintonizzati separatamente?

Come nota a margine: Akka ha un'implementazione del banco anello trova qui: http://github.com/jboner/akka-bench/tree/master/ring/

sarebbe interessante vedere quello che il risultato viene confrontato con il test Clojure sulla vostra macchina.

+7

Questo è quasi tre anni, ora :) Sarebbe molto interessante vedere un aggiornamento ora che clojure è intorno alla versione 1.5.1 e scala è intorno a 2.10.1 –

+2

@ Reb.Cabina fuori interesse Ho aggiornato il codice a funziona con le ultime versioni di Scala (2.11.2), Akka (2.3.5) e Clojure (1.6.0). Ottengo risultati simili per Clojure (~ 80K msg/sec per nodi da 1K a 100K), ma prestazioni molto migliori da Scala (+ 1M msg/sec per 10M nodi). È probabile che ciò sia prevedibile dal momento che il team di Akka ottimizzerebbe attivamente il throughput dei messaggi mentre la soluzione Clojure è più generica. – RoryD

Problemi correlati