アクターとエージェントを比較するために、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
コレクションのタイプをからに変更するlist
とvector
、一貫した動作が表示されます。100ノードの場合は100000メッセージ/秒、100000ノードの場合は80000メッセージ/秒です。したがって、ClojureAgentはScalaActorsよりも高速であるように見えます。リンクされたソースも更新しました。