Tak więc Scala 2.9 pojawiła się niedawno w testach Debiana, wprowadzając do niego nowoodkryte kolekcje równoległe.Radzenie sobie z zaskakującym brakiem ParList w scala.collections.parallel
Załóżmy, że mam kodu jakiś odpowiednik
def expensiveFunction(x:Int):Int = {...}
def process(s:List[Int]):List[Int} = s.map(expensiveFunction)
teraz z malusieńki bit ja zgromadzonego o kolekcjach równoległych przed docs faktycznie pojawił się na moim komputerze, spodziewałem parallelize to właśnie przez przełączenie Lista do ParList
... ale ku mojemu zdziwieniu, nie ma jednego! (Tylko ParVector
, ParMap
, ParSet
...).
Jako workround ten (lub równoważny jednej linii) wydaje się działać na tyle dobrze:
def process(s:List[Int]):List[Int} = {
val ps=scala.collection.parallel.immutable.ParVector()++s
val pr=ps.map(expensiveFunction)
List()++pr
}
uzyskując około x3 poprawę wydajności w kodzie testowym i osiągnięcie znacznie wyższe obciążenie procesora (rdzeń quad oraz Hyperthreading i7). Ale wydaje się trochę przyziemne.
Moje pytanie jest rodzajem zagregowanym:
- Dlaczego nie jest
ParList
? - Biorąc pod uwagę, że nie ma
ParList
, czy istnieje lepszy wzór/idiom, który powinienem przyjąć, aby nie czułem, że ich brakuje? - jestem po prostu „za czasów” Korzystanie wymienia LOT moich programów Scala (jak wszystkie książki Scala I odkupione w 2,7 dni nauczył mnie) i powinien być rzeczywiście szersze wykorzystanie
Vectors
? (Mam na myśli w C++ land Zasadniczo potrzebuję całkiem dobrego powodu, aby użyćstd::list
przezstd::vector
).