【发布时间】:2011-09-27 11:49:12
【问题描述】:
是否有任何已发布的微基准测试在多线程环境中比较 Scala 可变和不可变集合以及java.util.concurrent 中的集合?我对读者远远超过作者的情况特别感兴趣,比如在服务器端代码中缓存 HashMap。
Clojure 集合的微基准测试也是可以接受的,因为它们的算法类似于 Scala 2.8 持久性集合中使用的算法。
如果还没有完成,我会自己编写,但编写好的微基准测试并非易事。
【问题讨论】:
-
我认为你不太可能得到任何合理的基准来比较可变和不可变集合,因为应用程序本身的设计是不同的。
-
@Daniel:我们目前有一些包含 HashMap 的 Java 服务器代码,每次写入都会读取大约 1,000,000 次。该代码使用
synchronized,但即使数据实际上是不可变的,读者也会为所有这些争用读取支付罚金。我认为我可能能够使用来自功能性java的持久性集合,并且只有在用包含新项目的新“复制”集合替换旧集合时才锁定。 -
看起来是一个合理的预期,它说明了基准测试的问题。如果您测试这种负载,您就会偏向于不变性。但请注意,使用不可变映射时,您必须在每次更新时替换映射,这意味着您需要以某种方式序列化所有更新。如果您不介意读取滞后于写入,则地图本身可能会被 volatile 指向。
标签: scala collections immutability microbenchmark