API Stream був розроблений таким чином, щоб полегшити запис обчислень таким чином, щоб вони були абстраговані від того, як вони будуть виконані, що робить перемикання між послідовним та паралельним легким.
Однак, тому що це легко, не означає, що його завжди гарна ідея, а насправді погана ідея просто кинути .parallel()
всюди просто тому, що ви можете.
По-перше, зауважте, що паралелізм не пропонує жодних переваг, крім можливості швидшого виконання, коли є більше ядер. Паралельне виконання завжди матиме більше роботи, ніж послідовне, тому що, крім вирішення проблеми, воно також має виконувати диспетчеризацію та координацію підзадач. Сподіваємось, що ви зможете швидше дійти до відповіді, розбивши роботу на кількох процесорах; чи відбудеться це насправді, залежить від багатьох речей, включаючи розмір набору даних, скільки обчислень ви робите для кожного елемента, характер обчислень (зокрема, чи взаємодія обробки одного елемента з обробкою інших?) , кількість доступних процесорів та кількість інших завдань, які змагаються за ці процесори.
Далі зазначимо, що паралелізм також часто виявляє недетермінізм у обчисленнях, які часто приховуються послідовними реалізаціями; іноді це не має значення, або їх можна пом'якшити обмеженням залучених операцій (тобто оператори скорочення повинні бути без громадянства та асоціації.)
Насправді іноді паралелізм пришвидшить ваше обчислення, іноді - не, а іноді навіть сповільнить його. Найкраще спершу розробитись із використанням послідовного виконання, а потім застосувати паралелізм де
(A) Ви знаєте, що насправді користь для підвищення продуктивності та
(B) що він фактично забезпечить підвищення продуктивності.
(A) - це бізнес-проблема, а не технічна. Якщо ви експерт з ефективності, зазвичай зможете переглянути код і визначити (B), але розумний шлях - це виміряти. (І навіть не турбуйтеся, поки не переконаєтесь у цьому (A); якщо код досить швидкий, краще застосуйте мозкові цикли в іншому місці.)
Найпростішою моделлю продуктивності паралелізму є модель "NQ", де N - кількість елементів, а Q - обчислення на один елемент. Як правило, вам потрібно, щоб продукт NQ перевищив деякий поріг, перш ніж ви почнете отримувати перевагу від продуктивності. Для проблеми з низьким рівнем Q на кшталт "складання чисел від 1 до N", ви зазвичай бачите розбиття між N = 1000 і N = 10000. Якщо у вас проблеми із вищим Q-рівнем, ви побачите безперебійність при нижчих порогах.
Але реальність досить складна. Тому, поки ви не досягнете майстерності, спочатку визначте, коли послідовна обробка насправді щось вартує, а потім вимірюйте, чи допоможе паралелізм.