Почему GPars runForkJoin работает медленно, даже когда нет forkOffChild()?

Это последовательная версия:

void f(long n) {
   for (int i=1; i<n-1; i++) {
      // do nothing     
   }
}

List result = []
(1..99999).each {
   f(it)
   result << it
}

Выполнение кода занимает несколько секунд.

void f(long n) {
   for (int i=1; i<n-1; i++) {
      // do nothing
   }
}

withPool {
   runForkJoin(1,99999) { a, b ->
      List result = []
      (a..b).each {
         f(it)
         result << it
      }
      return result
   }
}

Код выше занимает несколько минут, чтобы закончить. Я не звонил forkOffChild() или же childrenResults() еще. Я запускаю этот код в Windows и одноядерный процессор с Intel Hyperthreading (2 логических процессора). Джава Runtime.runtime.availableProcessors() возвращает 2.

Я не понимаю, почему код, который использует runForkJoin намного медленнее, чем последовательный код (минуты против секунд).

1 ответ

Решение

Метод runForJoin() не влияет на производительность во фрагменте кода. Это метод withPool(), который вызывает замедление. Это связано с тем, что метод withPool() добавляет несколько методов xxxParallel() в динамическую область Groovy Object, что затем замедляет разрешение метода.

Аннотирование метода f() как @CompileStatic даст вам ожидаемую производительность.

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