2013-02-22 12 views
7

Próbuję przyspieszyć czas wykonania przy użyciu scala równoległości.Używanie równoległości scala podczas iteracji po przekonwertowanej liście java na niezmienny

Więc przekonwertować ArrayList java do niezmiennej jednym używać:

var imList = scala.collection.JavaConversions.asScalaBuffer(normalQLFolderList) 

a następnie skorzystać z wielu rdzeni podczas iteracji używam:

for (i <- imList .par) { 
} 

jestem wykorzystując Scala równoległość we właściwy sposób? W tym przypadku następuje iteracja listy. Czy istnieje asScalaBuffer?

+2

Scala'ish sposobem byłoby imList.par.map (x => yourFunction (x)) – Rajesh

+0

nie całkowicie się z tym zgadzam: nie ma nic fundamentalnie złego "dla" pętli w Scali - to inny sposób powiedzenia tego samego. Czasami wyraźna pętla for może być bardziej przejrzysta, szczególnie w przypadku mapowania płaskiego. –

Odpowiedz

5

Zbiory, które można konwertować na ich równoległe odpowiedniki w stałym czasie, obejmują zmienne i niezmienne mapy skrótów i zestawy mieszające, zakresy, wektory i tablice. Dla wszystkich innych typów kolekcji, w tym opakowań wokół kolekcji pochodzących z Javy, wywołanie par powoduje skopiowanie zawartości kolekcji do formatu bardziej odpowiedniego do równoległego.

ta opisana jest tutaj bardziej szczegółowo:

http://docs.scala-lang.org/overviews/parallel-collections/conversions.html

Jednakże, w zależności od tego, jak duży zbiór jest i jak drogie blok for jest, to może być całkowicie uzasadnione, aby zapłacić za tę konwersję. Im więcej przetwarzania równoległego bloku for dotyczy każdego elementu, tym bardziej zamortyzowany jest koszt konwersji.

Powiedziałabym, że jeśli obliczenia dla każdego elementu zawierają coś nietrywialnego (np. Przynajmniej tworzy nowe obiekty), opłacanie za konwersję ma sens, ale dobrym pomysłem jest pomiar różnicy wydajności między wersją sekwencyjną a równoległością wersja, która obejmuje wywołanie par:

http://docs.scala-lang.org/overviews/parallel-collections/performance.html

Powiązane problemy