[解決済み] 可能な限り常にパラレルストリームを使用した方がいいのでしょうか?
質問
Java 8とラムダを使えば、コレクションをストリームとして反復処理するのは簡単だし、並列ストリームを使うのも同じように簡単だ。以下の2つの例 ドキュメント 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()));
順番を気にしない限りは、常に並列を使うのが得策でしょうか?より多くのコアで作業を分担したほうが早いと思うのですが。
他に考慮すべき点はありますか?どのような場合に並列ストリームを使用し、どのような場合に非並列を使用すべきなのでしょうか?
(この質問は、並列ストリームをどのように、いつ使うかについての議論のきっかけにするためのものであり、常に使うことが良いアイデアだと私が思っているからではありません)。
どのように解決するのですか?
並列ストリームは、逐次ストリームに比べてはるかに高いオーバーヘッドを持ちます。スレッドを調整するのに多大な時間がかかります。私は、デフォルトでは逐次ストリームを使用し、以下の場合にのみ並列ストリームを検討します。
-
処理するアイテムが大量にある(または、各アイテムの処理に時間がかかり、並列化できる)
-
そもそも性能に問題がある
-
すでにマルチスレッド環境でプロセスを実行していない(例:Webコンテナで、すでに多くのリクエストを並列処理している場合、各リクエストの内部に並列処理を追加すると、プラスよりもマイナスの効果が大きくなる可能性があります)。
あなたの例では、パフォーマンスはとにかく
System.out.println()
この処理を並列化しても効果はない、もしくはマイナスにしかなりません。
さらに、並列ストリームが魔法のようにすべての同期の問題を解決してくれるわけではないことを覚えておいてください。もし、そのプロセスで使われる述語や関数が共有資源を使うなら、すべてがスレッドセーフであることを確認する必要があります。特に、副作用は、並列化した場合に本当に心配しなければならないことです。
いずれにせよ、推測ではなく、測定することです。並列化する価値があるかどうかは、測定してみなければわかりません。
関連
-
myeclipseでコンパイルするとAntエラーが発生する javaの例外が発生しました。
-
VMの初期化中にエラーが発生しました java/lang/NoClassDefFoundError: java/lang/Object
-
Eclipse起動エラー:javaは起動したが、終了コード=1を返した(ネット上の様々な落とし穴)
-
SocketTimeoutExceptionです。読み込みがタイムアウトしました
-
IDEA パッケージステートメントの欠落
-
Google Chromeのエラー「Not allowed to load local resource」の解決策について
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] ThreadLocal変数はいつ、どのように使用すればよいですか?
-
[解決済み] Java 8 の並列ストリームにおけるカスタムスレッドプール
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
javaの実行中に「javaの例外が発生しました」と表示された場合はどうすればよいですか?
-
Dateが型に解決できない問題を解決する
-
Javaクラスローダーにソースコードから潜り込む
-
サーブレットクラスのインスタンス化エラーの解決法
-
Spring BootのテストメソッドFailed to load ApplicationContextの問題を解決する
-
javaコンパイル時のエラー:不正な文字 '\ufeff' に対する解決策です。
-
が 'X-Frame-Options' を 'deny' に設定しているため、フレーム内にある。
-
SocketTimeoutExceptionの解決方法です。読み込みがタイムアウトした
-
このラインで複数のマーカーを解決する方法
-
[解決済み] ある文字列が配列のいずれかの文字列を含むかどうかをテストする