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

Я тестировал параллельные коллекции на 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

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

Другие вопросы по тегам