Код: Выделить всё
Optional ret = Arrays.stream( a ).parallel()
.mapToObj( source -> { some very heavy number crunching } )
.min( Comparator.comparing( s -> s.valueDelta ) );
Я могу «.peek()» и распечатать поток и увидите, что он использует 4 потока.
Время выполнения немного медленнее, чем замена потока последовательным циклом for, итерирующим по a.
Обработка чисел не имеет никаких операций ввода-вывода, взаимодействия, синхронизации и доступа. только структура данных только для чтения чтобы определить наилучшее значение «обмена».
Просто в качестве эксперимента я заменил обработку чисел на сон (2000), и все это завершилось через 2039 мс, так что, похоже, оно работает параллельно. Но обработка чисел совсем не ускоряется.
Если посмотреть с помощью проводника процессов и монитора ресурсов в Windows, кажется, что он использует только одно ядро.
Поэтому я попробовал запустить его на Linux и не получил лучших результатов.
По какой-то причине jvm неправильно использует доступные ядра при своей многопоточности.
Мы можем воспроизвести это на нескольких машинах, в Windows и Linux. и никто никогда получил какое-либо ускорение.
В качестве альтернативы я также реализовал его, используя фиксированный пул потоков размером 4, и снова, никакого ускорения, пока показаны 4 потока (я печатаю изнутри шаг для отладки, чтобы увидеть, есть ли у меня другой поток для параллельной печати).
Есть идеи?
Подробнее здесь: https://stackoverflow.com/questions/792 ... eally-work
Мобильная версия