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