Scala 可変データ構造は、メモリを事前に割り当てることにより、不変データ構造よりも効率的です。それらは多くの挿入に適しています (したがって、変更可能である理由)。Map が拡張する HashMap であるデフォルトの可変コレクションで += 関数の実装を見てみましょう。
https://github.com/scala/scala/blob/v2.9.2/src/library/scala/collection/mutable/HashMap.scala#L84
def += (kv: (A, B)): this.type = {
val e = findEntry(kv._1)
if (e == null) addEntry(new Entry(kv._1, kv._2))
else e.value = kv._2
this
}
HashMap は、addEntry を定義する HashTable を使用して変更可能な Map を実装します。
https://github.com/scala/scala/blob/v2.9.2/src/library/scala/collection/mutable/HashTable.scala#L117
protected def addEntry(e: Entry) {
val h = index(elemHashCode(e.key))
e.next = table(h).asInstanceOf[Entry]
table(h) = e
tableSize = tableSize + 1
nnSizeMapAdd(h)
if (tableSize > threshold)
resize(2 * table.length)
}
コレクションのサイズは、しきい値に達するたびに 2 倍になります。したがって、一度に n 個のエントリを空の可変データ構造に繰り返し追加する場合、サイズを変更する必要があるのは log(n) 回だけです。不変データ構造の実装については詳しく見ていませんが、挿入のたびにサイズを変更する必要があると思います。したがって、パフォーマンスの格差。