【问题标题】:Scala most efficient Map implementationScala 最高效的 Map 实现
【发布时间】:2015-03-15 17:39:49
【问题描述】:

在单线程中创建和使用 scala Map 时最好的选择是什么? (就像 java 在 StringBuffer 上与 StringBuilder 构造字符串相比的最佳选择)。

选择地图的约束类型有:

  • 地图只创建一次,可能已经存在的键有多个添加/更新
  • 没有从地图中删除 - 所以这种操作可能不需要
  • 地图可能有数千个值(不是那么大)
  • 使用来自同一个线程(因此无需担心并行访问/更新地图)
  • map 的签名可能是 Map[String,T]。如果有原因可以使用 Map[Int/Long,T]。

我调查过

  • collection.immutable.Map(最初为少数键优化
  • collection.immutable.HashMap
  • collection.mutable.OpenHashMap
  • collection.mutable.HashMap

测试表明,50000 个密钥没有明确的赢家。 我找到了一些

但问题是,在这种情况下,一般来说最安全的赌注是什么?为什么?

【问题讨论】:

  • 除非您考虑到一些相当具体的工作负载,或者您为某些具有特定限制的环境(低内存,只有一个处理器)编写它听起来您的研究已经出现在一般情况下,任何Map 实现都将运行良好,不会成为瓶颈。您如何定义“最佳”;最小的eC,最少的内存用于N 键,为插入生成的垃圾最少,执行操作时最少的上下文切换A -> B -> C,以上的某种组合还是完全其他?

标签: performance scala dictionary


【解决方案1】:

如果您的地图不是非常小且不是很大,并且您的密钥是String,那么collection.mutable.AnyRefMap 是一个不错的选择。如果您可以拥有Long 键,collection.mutable.LongMap 会更快。它们存在的原因正是为了在常见用例中快速。

如果大多数地图都非常小(0-4 个元素),那么LinkedHashMap 往往是最好的,因为它避免了哈希表的开销。 (不可变映射在 4 个或更少元素时也不错。)

如果映射真的很大(数以亿计的键/值对),那么标准的collection.mutable.HashMap 是可行的方法,因为当您用完单独的键的空间时,性能会稍微降低一些。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 2014-10-31
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    相关资源
    最近更新 更多