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