【发布时间】:2016-12-05 14:33:48
【问题描述】:
我遇到了关于将可变集合转换为不可变集合的奇怪行为,这可能会显着影响性能。
我们来看看下面的代码:
val map: Map[String, Set[Int]] = createMap()
while (true) {
map.get("existing-key")
}
它只是创建了一次映射,然后重复访问它的一个 enries,其中包含一个集合作为值。它可以通过多种方式创建地图:
使用不可变集合:
def createMap() = keys.map(key => key -> (1 to amount).toSet).toMap
或者使用可变集合(注意最后的两个转换选项):
def createMap() = {
val map = mutable.Map[String, mutable.Set[Int]]()
for (key <- keys) {
val set = map.getOrElseUpdate(key, mutable.Set())
for (i <- 1 to amount) {
set.add(i)
}
}
map.toMap.mapValues(_.toSet) // option #1
map.mapValues(_.toSet).toMap // option #2
}
奇怪的是,可变的#1 代码创建了一个映射,每当调用get(如果该条目存在)时,它就会在其值上调用toSet,这可能会导致显着的性能损失(取决于用例)。
为什么会这样?如何避免这种情况?
【问题讨论】:
标签: performance scala collections