Я недавно погрузился в Scala и (возможно, как и ожидалось) потратил довольно много времени на изучение API неизменяемых коллекций в стандартной библиотеке Scala.
Я пишу приложение, которое обязательно выполняет много + /- операции на больших наборах.По этой причине я хочу убедиться, что выбранная мной реализация представляет собой так называемую «постоянную» структуру данных, чтобы избежать копирования при записи.Я видел этот ответ Мартина Одерского, но это не совсем прояснило для меня проблему.
Я написал следующий тестовый код, чтобы сравнить производительность 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 должна быть некоторая информация о его производительности.