Скала разных параллельных структур
Я тестировал параллельные коллекции на 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, чтобы сделать его еще быстрее параллельно, я был бы рад протестировать их и выложить результаты здесь.
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
Вы также можете использовать актеров для достижения этой цели, но это потребует немного больше сантехники.