Java と競合:
- Java は、1996 年以来ネイティブ スレッドのサポートを提供し、java.util.concurrent や fork-join フレームワークなどのライブラリを含めるように進化し、常に同時プログラミングの促進の最前線に立っています。
ストリームと並列処理:
- Java 8 でのストリームの導入により、Parallel() メソッドを 1 回呼び出すだけで操作を並列化することが簡単になりました。ただし、たとえ簡単であっても、正しく高速な同時実行プログラムを作成することは依然として困難です。
パフォーマンスと障害:
- ストリーム パイプラインを不用意に並列化すると、パフォーマンスや活性の低下 (プログラムが終了しない) が発生する可能性があります。与えられた例は、ストリームを並列化すると、目に見える結果が得られずに CPU 使用率が大幅に増加する可能性があることを示しています。
ヒューリスティックと制限事項:
- 作業の分割に使用されるヒューリスティックが適切でない場合、ストリームの並列化は失敗する可能性があります。特に、追加の要素を計算するコストが非常に高くなる可能性がある Stream.iterate や limit などの操作では、失敗する可能性があります。
理想的なデータ構造:
ArrayList、HashMap、HashSet、ConcurrentHashMap、配列および範囲を介したストリームは、スレッド間での作業の分割が容易であり、参照の局所性が優れているため、並列化のより良い候補となります。
ターミナル操作:
- 並列実行の有効性は、ストリームの終了操作にも依存します。並列処理には、reduce、min、max、count、sum などのリダクション演算と、anyMatch、allMatch、noneMatch などのショートサーキット演算が適しています。
厳密な仕様:
- 並列パイプラインで使用される関数は、結合性、非干渉性、およびステートレスである必要があります。これらのルールに違反すると、不正確な結果や致命的な障害が発生する可能性があります。
約定命令:
- パイプラインを並列化すると出力が乱雑になる可能性があり、順序を維持するために forEachOrdered などの操作が必要になる場合があります。
正当化された並列処理:
- 明確な理由がある場合にのみストリームを並列化します。並列処理が不十分な場合、クラッシュやパフォーマンスの低下が発生する可能性があります。並列化が有益であることを確認するために、並列化の前後で常にパフォーマンスを測定します。
効果の例:
- 簡単な例では、π(n) 計算を並列化すると実行時間が 31 秒から 9.2 秒に短縮され、特定のシナリオでは並列処理が効率的であることが示されました。
SplittableRandom の使用:
- 並列乱数ストリームの場合は、ThreadLocalRandom や Random よりも SplittableRandom を優先してください。これは、この用途に特化して設計されており、より優れたパフォーマンスが得られるためです。
結論:
- そうすることで計算精度が維持され、速度が向上すると信じる十分な理由がない限り、ストリーム パイプラインを並列化しようとしないでください。実稼働コードに適用する前に、厳密なテストを実施して、並列処理が正当であることを検証します。
例
1.シーケンシャル ストリームとシーケンシャル ストリームの例パラレル
- この例は、シーケンシャル ストリームとパラレル ストリームのパフォーマンスの違いを示しています。
ParallelStreamExample.java
2. Parallel()
の非効率的な使用例
- この例は、並列化が予期しない動作を引き起こす可能性があることを示しています。
InefficientParallelStream.java
3. Parallel()
の効率的な使用例
- この例は、並列化によって実際にパフォーマンスが向上する状況を示しています。
EfficientParallelStream、java
4.並列ストリームによるセキュリティ上の欠陥の例
- この例は、適切に実装されていないreduce操作を並行して使用すると失敗する可能性があることを示しています。
ParallelStreamSafetyExample.java
5.並列ストリームの SplittableRandom を使用した例
- この例では、並列ストリームで SplittableRandom を使用してパフォーマンスを向上させる方法を示します。 SplittableRandomExample.java
これらの例は、並列化が役立つ状況を説明するのに役立ち、また、Parallel() を無差別に使用することの潜在的なリスクも示します。
以上が項目 並列ストリームを行う場合の注意事項の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。