scala - Clojure 的代理与 Scala 的 Actor 相比如何?

标签 scala concurrency clojure actor agents

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

当我将网络中的节点数量从 100 增加到 1000000 时,Scala 版本显示几乎恒定的消息交换率,而 Clojure 版本显示消息率随着节点数量的增加而下降。同样在单次运行期间,Clojure 版本中的消息率​​会随着时间的推移而降低。

所以我很好奇 Scala 的 Actors 与 Clojure 的 Agents 相比如何? Agents 的并发性是否比 Actors 低,还是代码编写效率低下(自动装箱?)?

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

编辑:

这两个版本都在同一个 JVM 上运行,所有 JVM 参数以及 Actor 和 Agent 配置参数都设置为默认值。在我的机器上,Scala 版本为 100 到 100 万个节点始终提供大约 5000 条消息/秒的消息速率,而 Clojure 版本从 100 个节点的 60000 条消息/秒开始,对于 100 万个节点降低到 200 条消息/秒。

编辑 2

事实证明,我的 Clojure 版本编写效率低下。我更改了 nodes 的类型收藏自 listvector现在它显示出一致的行为:100 个节点为 100000 条消息/秒,100000 个节点为 80000 条消息/秒。所以 Clojure Agents 似乎比 Scala Actors 更快。我也更新了链接的来源。

最佳答案

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

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

在对您的代码一无所知的情况下,我真的不能说太多,您是否使用相同的 JVM 参数,为 Actors 进行相同的、合理的设置与代理的合理设置,还是单独调整?

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

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

关于scala - Clojure 的代理与 Scala 的 Actor 相比如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3259296/

相关文章:

java.lang.NoClassDefFoundError : scala/StringContext

java - Play 2.2.1 Java : Whats the equivalent of @before filters from play 1. X?

scala - 将元素放入流中并返回一个对象

java - 更新 Java Swing JList

java - Hystrix 线程池属性

Clojure:分离 comp 和部分参数

java - 打开弦乐

wcf - 无法使对 WCF Web 服务的并发调用正常工作

clojure - 如何使用 clojure 查看 java 类中的所有私有(private)变量

java - 斯坦福 CoreNLP 管道 coref : parsing some short strings (with few mentions) returns indexoutofbounds exception