Stream API dirancang untuk membuatnya mudah untuk menulis perhitungan dengan cara yang disarikan dari bagaimana mereka akan dieksekusi, membuat beralih antara sekuensial dan paralel menjadi mudah.
Namun, hanya karena mudah, tidak berarti selalu merupakan ide yang bagus, dan pada kenyataannya, itu adalah ide yang buruk untuk drop.parallel()
seluruh tempat hanya karena Anda bisa.
Pertama, perhatikan bahwa paralelisme tidak menawarkan manfaat selain kemungkinan eksekusi lebih cepat ketika lebih banyak core tersedia. Eksekusi paralel akan selalu melibatkan lebih banyak pekerjaan daripada yang berurutan, karena selain menyelesaikan masalah, ia juga harus melakukan pengiriman dan koordinasi sub-tugas. Harapannya adalah Anda akan bisa mendapatkan jawaban lebih cepat dengan memecah pekerjaan di beberapa prosesor; apakah ini benar-benar terjadi tergantung pada banyak hal, termasuk ukuran kumpulan data Anda, berapa banyak perhitungan yang Anda lakukan pada setiap elemen, sifat perhitungan (khususnya, apakah pemrosesan satu elemen berinteraksi dengan pemrosesan yang lain?) , jumlah prosesor yang tersedia, dan jumlah tugas lain yang bersaing untuk prosesor tersebut.
Lebih lanjut, perhatikan bahwa paralelisme juga sering memperlihatkan nondeterminisme dalam perhitungan yang sering disembunyikan oleh implementasi berurutan; kadang-kadang ini tidak masalah, atau dapat dikurangi dengan membatasi operasi yang terlibat (yaitu, operator reduksi harus stateless dan asosiatif.)
Pada kenyataannya, terkadang paralelisme akan mempercepat perhitungan Anda, terkadang tidak, dan terkadang bahkan memperlambatnya. Yang terbaik adalah mengembangkan terlebih dahulu menggunakan eksekusi berurutan dan kemudian menerapkan paralelisme di mana
(A) Anda tahu bahwa sebenarnya ada manfaat untuk peningkatan kinerja dan
(B) bahwa itu benar-benar akan memberikan peningkatan kinerja.
(A) adalah masalah bisnis, bukan masalah teknis. Jika Anda seorang ahli kinerja, Anda biasanya dapat melihat kode dan menentukan (B), tetapi jalur pintar untuk mengukur. (Dan, jangan repot-repot sampai Anda yakin (A); jika kodenya cukup cepat, lebih baik untuk menerapkan siklus otak Anda di tempat lain.)
Model kinerja paling sederhana untuk paralelisme adalah model "NQ", di mana N adalah jumlah elemen, dan Q adalah perhitungan per elemen. Secara umum, Anda memerlukan produk NQ untuk melebihi ambang batas sebelum Anda mulai mendapatkan manfaat kinerja. Untuk masalah Q rendah seperti "tambahkan angka dari 1 ke N", Anda biasanya akan melihat titik impas antara N = 1000 dan N = 10.000. Dengan masalah Q yang lebih tinggi, Anda akan melihat breakevens di ambang yang lebih rendah.
Tetapi kenyataannya cukup rumit. Jadi sampai Anda mencapai keahlian, pertama-tama kenali kapan pemrosesan sekuensial benar-benar merugikan Anda, dan kemudian ukur apakah paralelisme akan membantu.