【发布时间】: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 个密钥没有明确的赢家。 我找到了一些
- simple microbenchmarks comparing Scala vs Java mutable map performance - 201 表明 OpenHashMap 可能是一个不错的选择
- New collections in Scala 2.7.2 - 2008
- 官方scaladoc Performance Characteristics 不提供方向,只是所有地图实现都需要eC - 实际上是恒定时间 进行查找和添加。
但问题是,在这种情况下,一般来说最安全的赌注是什么?为什么?
【问题讨论】:
-
除非您考虑到一些相当具体的工作负载,或者您为某些具有特定限制的环境(低内存,只有一个处理器)编写它听起来您的研究已经出现在一般情况下,任何
Map实现都将运行良好,不会成为瓶颈。您如何定义“最佳”;最小的eC,最少的内存用于N键,为插入生成的垃圾最少,执行操作时最少的上下文切换A -> B -> C,以上的某种组合还是完全其他?
标签: performance scala dictionary