Java Несоответствие времени обработки параллельных потоков - PullRequest
0 голосов
/ 03 августа 2020

На моем windows компьютере у меня 6 ядер.

Я создаю поток из 24 элементов и выполняю операцию над каждым элементом, используя операцию карты в Stream API. Я использую параллелизм:

myCollection.parallelStream()
                    .map(element -> someTimeConsumingOperation(element)
                    .collect(toList());

someTimeConsumingOperation имитирует длительную операцию, используя:

Thread.sleep(2000);

myCollection имеет 24 элемента. Я понимаю, что потоки используют исполнителя ForkJoinPool по умолчанию для параллельного выполнения операций, который, в свою очередь, учитывает количество ядер, чтобы определить, сколько потоков должно быть в пуле. Создано 6 потоков. Если это так, и каждая операция занимает почти 2 секунды, вся обработка потока должна занять около 8 секунд (каждый поток будет выполнять 4 операции, так как у нас есть 24 элемента для обработки, следовательно, 4 * 2 секунды).

Но я заметил, что обработка занимает всего 4 секунды.

1 Ответ

0 голосов
/ 05 августа 2020

В вашем 6-ядерном процессоре Intel включена HyperThreading . При использовании HT операционная система и приложения видят каждое ядро ​​ЦП как 2 отдельных «логических ядра» или «потока» (номенклатура может быть разной). Это означает, что ForkJoinPool будет использовать 12 потоков вместо 6.

«Логические ядра» совместно используют некоторые ресурсы друг с другом, поэтому параллельное выполнение 12 задач не даст вам вдвое большей пропускной способности, чем выполнение 6 задач. Но программа, которая вызывает только sleep(), не заметит разницы.

...