我在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更快。我也更新了链接的来源。
答案 0 :(得分:28)
[免责声明:我在Akka团队中]
Clojure Agent是与Scala演员不同的野兽,最值得注意的是,如果您考虑谁控制行为。在代理中,行为在外部定义并被推送到代理,在Actors中,行为在Actor内定义。
在不了解您的代码的情况下,我真的不能说太多,您是否使用相同的JVM参数,为Actors提升温度,为Actors提供合理的设置以及为Agent设置合理的设置,还是单独调整?
作为旁注: Akka在此处设置了环形工作台:http://github.com/jboner/akka-bench/tree/master/ring/
看看您的机器上的Clojure测试结果与您的结果相比会很有趣。