Scala最有效的Map实现

时间:2015-03-15 17:39:50

标签: performance scala dictionary

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

选择地图的约束类型是:

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

我调查了

  • collection.immutable.Map(最初用于优化用于少量键)
  • collection.immutable.HashMap
  • collection.mutable.OpenHashMap
  • collection.mutable.HashMap

测试表明,50000键没有明显的赢家。 我发现了一些

然而,问题是这种情况下最安全的赌注是什么?为什么?

1 个答案:

答案 0 :(得分:8)

如果您的地图不是非常小而且不是很大,并且您的密钥是String,则collection.mutable.AnyRefMap是一个不错的选择。如果您有collection.mutable.LongMap个密钥,Long会更快。它们存在的原因恰恰是对于常见用例来说很快。

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

如果地图非常庞大(数百万个键/值对),则标准collection.mutable.HashMap是可行的方法,因为当空间用完单独的键时,性能会稍微优雅地降低。