web-dev-qa-db-ja.com

Java 8ストリームとパラレルストリームの違い

Java 8ストリームと同じ機能の並列ストリームを使用して、集計関数を実行するカスタムコレクターを使用してコードを記述しました。htopを使用してCPU使用率を確認すると、すべてのCPU 「ストリーム」バージョンと「パラレルストリーム」バージョンの両方に使用されるコアです。したがって、list.stream()を使用すると、すべてのCPUも使用されるように見えます。 parallelStream()およびstream()マルチコアの使用.

31
Yogi Joshi

次のプログラムを検討してください。

_import Java.util.ArrayList;
import Java.util.List;

public class Foo {
    public static void main(String... args) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 1000; i++) {
            list.add(i);
        }
        list.stream().forEach(System.out::println);
    }
}
_

このプログラムは、リストにある順番で、0から999までの数字を順番に出力します。 stream()parallelStream()に変更すると、これはもはや当てはまりません(少なくとも私のコンピューターでは)。すべての数字が異なる順序で書き込まれます。したがって、明らかに、parallelStream()は実際に複数のスレッドを使用します。

htopは、シングルスレッドアプリケーションでさえ、ほとんどの最新のオペレーティングシステムによって複数のコアに分割されているという事実によって説明されます(同じスレッドの一部は複数のコアで実行できますが、同時にはできません)。したがって、プロセスが複数のコアを使用していることがわかった場合、これは必ずしもプログラムが複数のスレッドを使用しているという意味ではありません。

また、複数のスレッドを使用するとパフォーマンスが向上しない場合があります。同期のコストにより、複数のスレッドを使用する利点がなくなる可能性があります。単純なテストシナリオでは、これがよくあるケースです。たとえば、上記の例では、_System.out_が同期されます。そのため、複数のスレッドが使用されますが、事実上、同時に書けるのは数だけです。

45
Hoopje