【发布时间】:2011-03-16 14:46:57
【问题描述】:
我在 Scala (source here) (Scala 2.8 RC7) 和 Clojure (source here) (Clojure 1.1) 中编写了 Ring network topology 的模拟,用于比较 Actor 和 Agent。
当我将网络中的节点数量从 100 增加到 1000000 时,Scala 版本显示几乎恒定的消息交换率,而 Clojure 版本显示消息交换率随着节点数量的增加而降低。同样在单次运行期间,Clojure 版本中的消息速率会随着时间的推移而降低。
所以我很好奇 Scala 的 Actors 与 Clojure 的 Agents 相比如何? Agents 的并发性是否天生不如 Actors,或者代码编写效率低(自动装箱?)?
PS:我注意到 Scala 版本中的内存使用量随着节点数量的增加而增加很多(> 500 MB 对于 100 万个节点),而 Clojure 使用的内存要少得多(~ 100 MB 对于 100 万个节点)节点)。
编辑:
两个版本都在同一个 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 更快。我也更新了链接的来源。
【问题讨论】:
-
有一种方法可以使 Scala 演员“无线程”。我对 Clojure 了解不多,但如果您发布(相关部分)源代码会很好。
-
他链接到两个版本的源代码。
-
在您的
Edit 2中,您可能是指inefficiently? -
我不知道 Scala,所以我在这里唯一能说的是有两个演员一个(女巫不能很好地扩展)是每个线程一个演员,另一个是基于事件的所以也许那是一种改进你的scala代码的方法?关于代理,我唯一能说的是来自线程池的使用威胁。我想在这里得到一位专家的答复。或许可以在 Clojure 和 Scala 组上提问。
-
查看 Viktor 提到的 Akka 中的 benchmark 实现,有一个 Akka 实现和一个标准 Scala actor 实现
标签: scala concurrency clojure actor agents