2011-09-27 85 views
5

是否有任何发布的微基准比较Scala可变集合和不可变集合,以及多线程环境中的集合java.util.concurrent ?我特别感兴趣的是读者远远多于编写者的情况,比如在服务器端代码中缓存HashMaps。微基准比较Scala可变,不可变集合与java.util.concurrent。*集合

Clojure集合的微基准也是可以接受的,因为它们的算法类似于Scala 2.8持久集合中使用的算法。

我会写我自己的,如果还没有完成,但写出好的微基准不是微不足道的。

+0

我认为你不可能得到比较可变集合和不可变集合的任何合理基准,因为应用程序本身的设计是不同的。 –

+0

@Daniel:我们目前有一些Java服务器代码,其中包含每次写入时读取约1,000,000次的HashMaps。该代码使用'synchronized',但读者为所有这些竞争性读取付费,即使数据是有效的不可变的。我认为只有在用包含新项目的新“已复制”集合替换旧集合时,我才能够使用functionaljava的持久集合并锁定。 – Ralph

+0

看起来像一个合理的期望,它说明了基准测试的问题。如果你测试这种负载,你是为了不变性而进行偏置。但请注意,使用不可变映射时,无论何时更新,都必须重新映射映射,这意味着您需要以某种方式序列化所有更新。如果您不介意读取滞后写入,那么映射本身可能会被一个易变的指向。 –

回答

2

有一些成果在这里比较的Java哈希映射,斯卡拉哈希映射,Java的并发哈希映射,Java的并发跳跃列表,Java的并行阵列和Scala并行集合(在技术报告的结尾):

http://infoscience.epfl.ch/record/165523/files/techrep.pdf

有并发跳跃列表和Java并发散的更详细的比较映射在这里(也以报告的主要部分的结束,阑尾前):

http://infoscience.epfl.ch/record/166908/files/ctries-techreport.pdf

这些微基准专注于测试单个操作的性能。如果你打算写你自己的基准,这将可能是有用的:

http://buytaert.net/files/oopsla07-georges.pdf

+0

非常好!谢谢。 – Ralph

+0

您可以在这里找到第一篇论文中的一些基准测试的源代码:http://lampsvn.epfl.ch/svn-repos/scala/scala/trunk/test/benchmarks/,但它们有些没有结构化。对于第二个:https://github.com/axel22/Ctries,看一下src/bench。 – axel22

+0

以下是关于Scala收集操作的详细基准:https://github.com/scalameter/scalameter/tree/master/src/test/scala/org/scalameter/collections – axel22

0

为什么不尝试使用java.util.concurrent.ConcurrentHashMap呢?这样你就不必同步,而且你的数百万次读取速度会更快(以及一次写入)。

+1

我认为这是一个谬论。如果您从HashMap中读取(可变)值,请更新该值,然后尝试放回,您仍然必须同步该操作。我不确定你是否可以用'replace'来完成。 – Ralph

+0

另一种选择是使用Clojure的STM(可以使用Java)。虽然我不确定你会如何使用HashMap ... – Chochos