Итак, scala 2.9 недавно появился в тестировании Debian, принеся с собой новомодные параллельные коллекции.
Предположим, у меня есть некоторый код, эквивалентный
def expensiveFunction(x:Int):Int = {...}
def process(s:List[Int]):List[Int} = s.map(expensiveFunction)
, из крошечного бита IЯ собирал информацию о параллельных коллекциях до того, как документы действительно появились на моей машине, я ожидал распараллелить это, просто переключив Список на 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
, есть ли лучший шаблон / идиома, которую я должен принять, чтобы я не чувствовал, что они пропали? - Я просто "отсталый", часто использую списки в моемпрограммы scala (как и все книги о Scala, которые я купил за 2,7 дня, научили меня), и мне действительно нужно больше использовать
Vectors
?(Я имею в виду, что в земле C ++ мне обычно нужна довольно веская причина для использования std::list
сверх std::vector
).