Почему 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 даст вам ожидаемую производительность.