Итак, scala 2.9 недавно появился в тестировании Debian, привнеся с собой новомодные параллельные коллекции.
Предположим, у меня есть некоторый код, эквивалентный
def expensiveFunction(x:Int):Int = {...}
def process(s:List[Int]):List[Int} = s.map(expensiveFunction)
, теперь из того крохотного бита, который я почерпнул о параллельных коллекциях до того, как документы действительно появились на моей машине, я ожидал распараллелить это, просто переключив List на ParList
... но, к моему удивлению, его нет! (Просто ParVector
, ParMap
, ParSet
...).
В качестве рабочего решения этот (или однострочный эквивалент), кажется, работает хорошо Достаточно:
def process(s:List[Int]):List[Int} = {
val ps=scala.collection.parallel.immutable.ParVector()++s
val pr=ps.map(expensiveFunction)
List()++pr
}
дает увеличение производительности моего тестового кода примерно в 3 раза и значительно увеличивает загрузку ЦП (четырехъядерный процессор плюс i7 с гиперпоточностью). Но это кажется неуклюжим.
Мой вопрос является своего рода агрегированным:
ParList
? ParList
, есть ли
лучший шаблон / идиома, которую я должен принять, чтобы
Я не чувствую, что они пропали? Векторы
? (Я имею в виду на земле C ++
Обычно мне нужна довольно веская причина для использования
std :: list
поверх std :: vector
).