【发布时间】:2011-08-04 19:59:53
【问题描述】:
我最近一直在研究 Scala,并且(也许可以预见)花了很多时间研究 Scala 标准库中的不可变集合 API。
我正在编写一个应用程序,它必须在大型集合上执行许多 +/- 操作。出于这个原因,我想确保我选择的实现是所谓的“持久”数据结构,这样我就可以避免写时复制。我看到了 Martin Odersky 的 this answer,但它并没有真正解决我的问题。
我写了下面的测试代码来比较 ListSet 和 HashSet 对 add 操作的性能:
import scala.collection.immutable._
object TestListSet extends App {
var set = new ListSet[Int]
for(i <- 0 to 100000) {
set += i
}
}
object TestHashSet extends App {
var set = new HashSet[Int]
for(i <- 0 to 100000) {
set += i
}
}
这是 HashSet 的粗略运行时测量:
$ time scala TestHashSet
real 0m0.955s
user 0m1.192s
sys 0m0.147s
和列表集:
$ time scala TestListSet
real 0m30.516s
user 0m30.612s
sys 0m0.168s
单链表的缺点是一个常数时间的操作,但这种性能看起来是线性的或更差。这种性能损失是否与需要检查集合的每个元素的对象相等性以符合 Set 的无重复不变量的需要有关?如果是这种情况,我意识到这与“持久性”无关。
至于官方文档,我只能找到以下页面,但似乎不完整:Scala 2.8 Collections API -- Performance Characteristics。由于 ListSet 最初似乎是其内存占用的好选择,因此 API 文档中可能应该有一些关于其性能的信息。
【问题讨论】:
标签: scala set immutability time-complexity