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

Abh*_*kar 27 concurrency scala clojure agents actor

我在Scala(源代码)(Scala 2.8 RC7)和Clojure(源代码)(Clojure 1.1)中编写了一个环网络拓扑模拟,用于比较Actors和Agents.

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

所以我很好奇Scala的演员如何与Clojure的特工比较?Agent本身是否比Actors更少并发或代码编写效率低(autoboxing?)?

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

编辑:

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

编辑2

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

Vik*_*ang 28

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

Clojure Agent是一个与Scala演员不同的野兽,最值得注意的是如果你想到谁控制了这个行为.在代理中,行为在外部定义并被推送到代理,在Actors中,行为在Actor内定义.

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

作为旁注: Akka在这里有一个环形工作台的实现:http://github.com/jboner/akka-bench/tree/master/ring/

看看你的机器上的Clojure测试结果与之相比会很有趣.

  • 这已经差不多三年了,现在:)看到一个更新,现在clojure是1.5.1版本,scala大约是2.10.1,这将是非常有趣的 (7认同)
  • @ Reb.Cabin出于兴趣我更新了代码以运行最新的Scala(2.11.2),Akka(2.3.5)和Clojure(1.6.0)版本.我得到了类似的Clojure结果(1K到100K节点大约80K msg /秒),但Scala的性能要好得多(10M节点的速度为+ 1M msg /秒).这可能是预期的,因为Akka团队将积极优化消息吞吐量,而Clojure解决方案更通用. (3认同)