Clojure的代理人如何与Scala的演员比较?

时间:2010-07-15 19:38:30

标签: scala concurrency clojure actor agents

我在Scala(Ring network topology)(Scala 2.8 RC7)和Clojure(source here)(Clojure 1.1)中编写了source here的模拟,用于比较Actors和Agents。

虽然Scala版本显示几乎恒定的消息交换率,因为我将网络中的节点数从100增加到1000000,但Clojure版本显示的消息速率随着节点数量的增加而减少。同样在单次运行期间,Clojure版本中的消息速率会随着时间的推移而减少。

所以我很好奇Scala的Actors与Clojure的Agent有何比较? Agent本身是否比Actors更少并发或代码编写效率低(自动装箱?)?

PS:我注意到Scala版本中的内存使用量随着节点数量的增加而增加很多(对于100万个节点而言> 500 MB),而Clojure使用的内存少得多(约100 MB用于1)百万节点。

修改

两个版本都在相同的JVM上运行,并且所有JVM参数和Actor和代理配置参数都设置为默认值。在我的机器上,Scala版本为100到100万个节点提供了大约5000个消息/秒的消息速率,而Clojure版本以100个节点的60000消息/秒开始,对于100万个节点减少到200个消息/秒。

修改2

原来我的Clojure版本编写效率低下。我将nodes集合的类型从list更改为vector,现在它显示了一致的行为:100个节点为100000条消息/秒,100000个节点为80000条消息/秒。所以Clojure Agent似乎比Scala Actors更快。我也更新了链接的来源。

1 个答案:

答案 0 :(得分:28)

[免责声明:我在Akka团队中]

Clojure Agent是与Scala演员不同的野兽,最值得注意的是,如果您考虑谁控制行为。在代理中,行为在外部定义并被推送到代理,在Actors中,行为在Actor内定义。

在不了解您的代码的情况下,我真的不能说太多,您是否使用相同的JVM参数,为Actors提升温度,为Actors提供合理的设置以及为Agent设置合理的设置,还是单独调整?

作为旁注: Akka在此处设置了环形工作台:http://github.com/jboner/akka-bench/tree/master/ring/

看看您的机器上的Clojure测试结果与您的结果相比会很有趣。