可能な場合は常に並列ストリームを使用する必要がありますか? 質問する

可能な場合は常に並列ストリームを使用する必要がありますか? 質問する

Java 8とラムダを使えば、コレクションをストリームとして反復処理するのは簡単ですし、並列ストリームを使うのも簡単です。ドキュメント2 番目は parallelStream を使用します。

myShapesCollection.stream()
    .filter(e -> e.getColor() == Color.RED)
    .forEach(e -> System.out.println(e.getName()));

myShapesCollection.parallelStream() // <-- This one uses parallel
    .filter(e -> e.getColor() == Color.RED)
    .forEach(e -> System.out.println(e.getName()));

順序を気にしない限り、並列を使用することは常に有益でしょうか? 作業をより多くのコアに分割する方が速いと考える人もいるでしょう。

他に考慮すべき点はありますか? 並列ストリームはいつ使用すべきで、非並列ストリームはいつ使用すべきですか?

(この質問は、並列ストリームを常に使用することが良いアイデアだと考えているからではなく、並列ストリームをいつどのように使用するかについての議論を促すために尋ねられたものです。)

ベストアンサー1

並列ストリームは、シーケンシャルストリームに比べてオーバーヘッドがはるかに高くなります。スレッドの調整にはかなりの時間がかかります。私はデフォルトでシーケンシャルストリームを使用し、並列ストリームを検討するのは次のような場合のみです。

  • 処理するアイテムが大量にある(または各アイテムの処理に時間がかかり、並列化できる)

  • そもそもパフォーマンスに問題がある

  • プロセスをマルチスレッド環境で実行していない (たとえば、Web コンテナーで、並列処理するリクエストがすでに多数ある場合、各リクエスト内に並列処理のレイヤーを追加すると、プラスの影響よりもマイナスの影響の方が大きくなる可能性があります)

あなたの例では、パフォーマンスは への同期アクセスによって左右されSystem.out.println()、このプロセスを並列化しても効果はなく、むしろマイナスの影響が出る可能性があります。

さらに、並列ストリームによってすべての同期の問題が魔法のように解決されるわけではないことに注意してください。プロセスで使用される述語と関数によって共有リソースが使用される場合は、すべてがスレッドセーフであることを確認する必要があります。特に、並列化を行う場合は副作用について本当に心配する必要があります。

いずれにせよ、推測するのではなく、測定してください。測定によってのみ、並列処理が価値があるかどうかがわかります。

おすすめ記事