Решение проблемы удивительного отсутствия ParList в scala.collections.parallel

Итак, 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 , есть ли лучший шаблон / идиома, которую я должен принять, чтобы Я не чувствую, что они пропали?
  • Я просто «отстал от времени», используя Списки много в моих программах Scala (как и во всех книгах Scala, которые я купил еще за 2,7 дня меня научили) и На самом деле мне следовало бы больше использовать Векторы ? (Я имею в виду на земле C ++ Обычно мне нужна довольно веская причина для использования std :: list поверх std :: vector ).
10
задан axel22 10 July 2011 в 16:29
поделиться