Scala最有效的Map实现

rai*_*tin 3 performance dictionary scala

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

选择Map的约束类型是:

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

我调查过

  • collection.immutable.Map(最初针对少数键进行了优化)
  • collection.immutable.HashMap
  • collection.mutable.OpenHashMap
  • collection.mutable.HashMap

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

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

Rex*_*err 8

如果你的地图不是非常小而且不是很大,并且你的关键是a String,那么这collection.mutable.AnyRefMap是一个不错的选择. collection.mutable.LongMap如果你有Long钥匙就更快.它们存在的原因恰恰是对于常见用例而言是快速的.

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

如果地图真的很大(数百万个键/值对),那么标准collection.mutable.HashMap就是要走的路,因为当你的空间用完了单独的键时,性能会稍微优雅地降低.