Почему в этом сценарии внутренние параллельные потоки выполняются быстрее с новыми пулами, чем с общим пулом?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Почему в этом сценарии внутренние параллельные потоки выполняются быстрее с новыми пулами, чем с общим пулом?

Сообщение Anonymous »

Недавно я провел тест, в котором сравнил производительность вложенных потоков в трех случаях:
  • Параллельный внешний поток и последовательный внутренний поток
  • Параллельные внешние и внутренние потоки (с использованием ParallelStream) — это эффективно проверяет `ForkJoinPool.commonPool()
  • Параллельные внешние и внутренние потоки, но внутренние потоки создают новый ForkJoinPool для каждой задачи
Вот код теста (я использовал JMH):

Код: Выделить всё

public class NestedPerf {
@State(Scope.Benchmark)
public static class StateData{
public static final List outerLoop = IntStream.range(0, 32).boxed().toList();
public static final List innerLoop = IntStream.range(0, 32).boxed().toList();
}
private static void runInNewPool(Runnable task) {
ForkJoinPool pool = new ForkJoinPool();
try {
pool.submit(task).join();
} finally {
pool.shutdown();
}
}
private static void innerParallelLoop() {
StateData.innerLoop.parallelStream().unordered().forEach(i -> {
try {
Thread.sleep(5);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
}
private static void innerSequentialLoop() {
StateData.innerLoop.stream().unordered().forEach(i -> {
try {
Thread.sleep(5);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
}
@Benchmark
public void testingNewPool(Blackhole bh){
StateData.outerLoop.parallelStream().unordered().forEach(i -> {
runInNewPool(ParallelPerf::innerParallelLoop);
bh.consume(i);
});
}

@Benchmark
public void testingCommonPoolWithSequentialInner(Blackhole bh){
StateData.outerLoop.parallelStream().unordered().forEach(i -> {
innerSequentialLoop();
bh.consume(i);
});
}
@Benchmark
public void testingCommonPool(Blackhole bh){
StateData.outerLoop.parallelStream().unordered().forEach(i -> {
innerParallelLoop();
bh.consume(i);
});
}
}
И вот результат:

Код: Выделить всё

Benchmark                                         Mode  Cnt   Score   Error  Units
NestedPerf.testingCommonPool                     thrpt   25   1.935 ± 0.005  ops/s
NestedPerf.testingCommonPoolWithSequentialInner  thrpt   25   1.744 ± 0.007  ops/s
NestedPerf.testingNewPool                        thrpt   25  22.648 ± 0.559  ops/s
Разница между методом с новыми пулами и методом с общим пулом удивительна. Есть ли у кого-нибудь идеи, почему создание новых пулов ускоряет этот тест примерно в 20 раз?
Если это поможет, я запускаю это на системе Core i7 10850H с 12 доступными процессорами (шестнадцатеричный процессор + гиперпоточность).

Подробнее здесь: https://stackoverflow.com/questions/792 ... monpool-fo
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»