【问题标题】:Micro-benchmark comparing Scala mutable, immutable collections with java.util.concurrent.* collections将 Scala 可变、不可变集合与 java.util.concurrent.* 集合进行比较的微基准测试
【发布时间】: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


【解决方案1】:

这里有一些比较 Java 哈希映射、Scala 哈希映射、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

【讨论】:

【解决方案2】:

李浩毅的Benchmarking Scala Collections 是一份详细而全面的研究,可以解决您的疑问。在这里引用太长了。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我认为这是一个谬论。如果您从 HashMap 中读取一个(可变)值,更新该值,然后尝试将其放回,您仍然必须同步操作。我不确定你是否可以使用replace 来做到这一点。
    • 另一种选择是使用 Clojure 的 STM(您可以从 Java 中使用它)。虽然我不确定你如何将它与 HashMap 一起使用...
    猜你喜欢
    • 2012-01-07
    • 2017-05-21
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2011-11-24
    • 2012-01-19
    • 2011-03-11
    • 2013-08-30
    相关资源
    最近更新 更多