Scala разные параллельные структуры

Я протестировал параллельные коллекции на Scala и простую коллекцию, вот мой код:

def parallelParse()
  {
    val adjs = wn.allSynsets(POS.ADJECTIVE).par
    adjs.foreach(adj => {
      parse(proc.mkDocument(adj.getGloss))
    })
  }

  def serialParse()
  {
    val adjs = wn.allSynsets(POS.ADJECTIVE)
    adjs.foreach(adj => {
      parse(proc.mkDocument(adj.getGloss))
    })
  } 

Параллельная сборка ускоряется примерно в 3 раза. Какие еще у меня есть варианты в Scala, чтобы сделать его еще быстрее параллельно, я был бы рад их протестировать и выложить результаты здесь.


person Omid    schedule 07.07.2014    source источник


Ответы (1)


Вы можете использовать фьючерсы для запуска асинхронных вычислений. Вы можете сделать:

import scala.concurrent._
import scala.concurrent.duration._
import ExecutionContext.Implicits.global
val futures = wn.allSynsets(POS.ADJECTIVE).map(adj => Future {
  parse(proc.mkDocument(adj.getGloss))
})
futures.foreach(f => Await.ready(f, Duration.Inf))

В зависимости от объема работы над каждым элементом в allSynsets и количества элементов в allSynsets (слишком много элементов -> слишком много фьючерсов -> больше накладных расходов), вы можете получить худшие результаты с фьючерсами.

Чтобы убедиться, что вы проводите бенчмаркинг правильно, рассмотрите возможность использования встроенной функции бенчмаркинга ScalaMeter 0.5:

http://scalameter.github.io/home/gettingstarted/0.5/inline/index.html

Вы также можете использовать актеров для достижения этого, но это потребует немного больше сантехники.

person axel22    schedule 07.07.2014
comment
Я использовал будущее и эталонный тест, но он внезапно сообщает время, которое точно неверно, есть идеи? Вот код: val time = measure { futureParse() } println(s"Total time future: $time") def futureParse() { wn.allSynsets(POS.ADJECTIVE).foreach(adj => Future { parse(proc.mkDocument(adj.getGloss)) }) } - person Omid; 08.07.2014
comment
Извините, я, должно быть, устал, когда писал пример кода. Вы должны дождаться завершения фьючерсов. Я отредактировал свой ответ, чтобы сопоставить каждый элемент с Future, а затем дождаться, пока каждый из фьючерсов завершит свою работу. - person axel22; 08.07.2014