29

アクターとエージェントを比較するために、Scala(ソースはこちら)(Scala 2.8 RC7)とClojure(ソースはこちら)(Clojure 1.1)のリングネットワークトポロジのシミュレーションを作成しました。

Scalaバージョンはネットワーク内のノード数を100から1000000に増やすとほぼ一定のメッセージ交換レートを示しますが、Clojureバージョンはノード数の増加とともに減少するメッセージレートを示します。また、1回の実行中、Clojureバージョンのメッセージレートは時間の経過とともに低下します。

だから私はScalaの俳優がClojureのエージェントとどのように比較されるのか興味がありますか?エージェントは本質的にアクターよりも並行性が低いのですか、それともコードは非効率的に記述されていますか(オートボクシング?)?

PS:Scalaバージョンのメモリ使用量はノード数の増加に伴って大幅に増加しますが(100万ノードの場合は> 500 MB)、Clojureバージョンのメモリ使用量ははるかに少なくなります(100万ノードの場合は約100 MB)。

編集:

両方のバージョンは同じJVMで実行されており、すべてのJVM引数とアクターおよびエージェントの構成パラメーターがデフォルトとして設定されています。私のマシンでは、Scalaバージョンは1億から100万ノードで一貫して約5000メッセージ/秒のメッセージレートを提供しますが、Clojureバージョンは100ノードで60000メッセージ/秒で始まり、100万ノードで200メッセージ/秒に減少します。

編集2

私のClojureバージョンは非効率的に書かれていることがわかりました。nodesコレクションのタイプをからに変更するlistvector、一貫した動作が表示されます。100ノードの場合は100000メッセージ/秒、100000ノードの場合は80000メッセージ/秒です。したがって、ClojureAgentはScalaActorsよりも高速であるように見えます。リンクされたソースも更新しました。

4

1 に答える 1

29

[免責事項:私はAkkaチームに所属しています]

Clojure Agentは、Scalaアクターとは別の獣であり、特に、誰が行動を制御するかを考える場合に顕著です。エージェントでは、動作は外部で定義されてエージェントにプッシュされ、アクターでは、動作はアクターの内部で定義されます。

あなたのコードについて何も知らずに、私は本当に多くを言うことができません、あなたは同じJVMパラメータを使用していますか、アクターの同じ、賢明な設定とエージェントの賢明な設定をウォームアップしていますか、それとも別々に調整されていますか?

補足として: Akkaには、次の場所にあるリングベンチの実装があります:http://github.com/jboner/akka-bench/tree/master/ring/

結果がマシンでのClojureテストと比較されるのを見るのは興味深いでしょう。

于 2010-07-15T21:07:18.483 に答える