29

我在 Scala(这里的源代码)(Scala 2.8 RC7)和 Clojure(这里的源代码)(Clojure 1.1)中编写了一个环形网络拓扑的模拟,用于比较 Actor 和 Agent。

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

所以我很好奇 Scala 的 Actor 与 Clojure 的 Agent 相比如何?代理是否天生就比 Actor 的并发性低,或者代码编写效率低(自动装箱?)?

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集合的类型从更改listvector,现在它显示了一致的行为:100 个节点为 100000 消息/秒,100000 个节点为 80000 消息/秒。所以 Clojure 代理似乎比 Scala Actors 更快。我也更新了链接的来源。

4

1 回答 1

29

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

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

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

附带说明: Akka在此处有一个环形台的实现:http: //github.com/jboner/akka-bench/tree/master/ring/

将结果与您机器上的 Clojure 测试进行比较会很有趣。

于 2010-07-15T21:07:18.483 回答