Wie Clojure-Agenten vergleichen zu Scala ' s actors?

Schrieb ich eine simulation der Ring-Netzwerk-Topologie in Scala (Quelle hier) (Scala 2.8 RC7) und Clojure (Quelle hier) (Clojure 1.1) für einen Vergleich der Akteure und Agenten.

Während die Scala-version zeigt nahezu Konstante message exchange rate wie erhöhe ich die Anzahl der Knoten im Netzwerk von 100 bis 1000000, die Clojure-version zeigt die Nachricht raten, die Abnahme mit der Zunahme in der Anzahl der Knoten. Auch die während einer einzigen Ausführung, die message-rate in Clojure-version sinkt wie die Zeit vergeht.

So, ich bin gespannt, wie die Scala der Akteure zu vergleichen, um Clojure-Agenten? Sind Agenten von Natur aus weniger Auger als Schauspieler oder ist der code schlecht geschrieben (autoboxing?)?

PS: ich stellte fest, dass die Speicherauslastung in der Scala-version erhöht mit der Erhöhung der Anzahl der Knoten (> 500 MB für 1 million Knoten), während die Clojure verwendet man viel weniger Speicher (~ 100 MB für 1 million Knoten).

Edit:

Beide Versionen laufen auf derselben JVM mit allen JVM-args und Schauspieler und Agent-Konfiguration Parameter als Standard festlegen. Auf meinem Rechner, die Scala-version gibt ein message-rate von rund 5000 message/sec konstant bei 100 zu 1 million Knoten, in der Erwägung, dass die Clojure-version startet mit 60000 Nachricht/sec für 100 Knoten die Rückgänge zu 200 Nachrichten/sec für 1 Mio Knoten.

Edit 2

Stellt sich heraus, dass meine Clojure-version war schlecht geschrieben. Ich änderte die Art der nodes Sammlung von list zu vector und nun zeigt konsequentes Verhalten: 100000 message/sec für 100 Knoten und 80000 Nachricht/sec für 100000 Knoten. So Clojure Agents scheinen schneller zu sein als die Scala-Schauspieler. Ich habe aktualisiert die verlinkten Quellen zu.

  • Es ist ein Weg, um ein Scala-Schauspieler "threadless". Ich weiß nicht viel über Clojure, aber es wäre schön, wenn du gepostet hast (relevanten Teile der) Ihren source-code.
  • Er verknüpft die Quelle für beide Versionen.
  • In Ihrem Edit 2 du meinst wohl inefficiently?
  • Ich weiß nicht, Scala, so dass die einzige Sache, die ich hier sagen kann ist, dass es zwei Acters eine (Hexe Umfang nicht zu gut) ist ein Schauspieler pro thread und der andere ist Event-basiert, so dass vielleicht das ist ein Weg, um Ihre Impro-scala-code? Das einzige was ich sagen kann, über Agenten ist, dass die Drohungen von einem threadpool. Ich wäre intressting, um hier eine Antwort von einem Experten. Vielleicht Fragen Sie auf der Clojure und Scala Gruppen.
  • ich habe das Ereignis beruhen, geben hier.
  • Siehe die benchmark-Umsetzung in Akka erwähnt durch Viktor, es ist ein Akka-Implementierung und eine standard-Scala-Schauspieler, Umsetzung
  • in edit 2 Sie sprechen von über 100.000 Knoten noch ursprünglich Zustand mit 1e6 Knoten für scala. ist das ein Tippfehler? einfach nur neugierig, weil Sie berichten, dass clojure läuft schneller als scala. einfach nur neugierig

Schreibe einen Kommentar