Недавно я нырял в Scala и (возможно, предсказуемо) потратил немало времени на изучение неизменяемого API-интерфейса коллекции в стандартной библиотеке Scala.
Я пишу приложение, которое обязательно выполняет много операций +/- на больших наборах. По этой причине я хочу убедиться, что выбранная реализация - это так называемая "постоянная" структура данных, чтобы я не делал copy-on-write. Я видел этот ответ от Мартина Одерского, но на самом деле это не совсем ясно для меня.
Я написал следующий тестовый код, чтобы сравнить производительность ListSet и HashSet для операций добавления:
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
И ListSet:
$ time scala TestListSet
real 0m30.516s
user 0m30.612s
sys 0m0.168s
Минусы в односвязном списке - это операция с постоянным временем, но эта производительность выглядит линейной или хуже. Является ли эта производительность удачной, связанной с необходимостью проверки каждого элемента набора для равенства объекта, чтобы он соответствовал инварианту без дубликатов Set? Если это так, я понимаю, что это не связано с "настойчивостью".
Что касается официальной документации, все, что я мог найти, это следующая страница, но она кажется неполной: Scala 2.8 API коллекций - характеристики производительности. Поскольку ListSet, по-видимому, первоначально является хорошим выбором для области памяти, возможно, в документах API должна быть информация о его производительности.