PR

 つまり、集約処理にConcurrentMapインタフェースを使用できるため、パラレルストリームの場合パフォーマンスが向上します。

 たとえば、単語のリストを、先頭文字ごとにグループ分けする場合、リスト7の(2)の方がパフォーマンスが高くなります。

リスト7 単語を先頭文字でグルーピング

        List<String> words = ...;
        
        // (1) Mapインタフェースを使用
        Map<String, List<String>> wordMap
                = words.parallelStream()
                       .map(w -> w.toLowerCase())
                       .collect(Collectors.groupingBy(w -> w.substring(0, 1)));

        // (2) ConcurrentMapインタフェースを使用
        ConcurrentMap<String, List<String>> wordConcurrentMap
                = words.parallelStream()
                       .map(w -> w.toLowerCase())
                       .collect(Collectors.groupingByConcurrent(w -> w.substring(0, 1)));

 パフォーマンスは異なるものの、groupingByメソッドとgroupingByConccurrentメソッドで処理結果は同一になります。

パラレルストリームの注意点

 パラレルストリームは、ほぼ普通のストリームと同じように使うことができます。しかし、パラレルストリームは使い方が悪いと、パフォーマンスが悪くなってしまうこともあります。

 そこで、パラレルストリームを使う上で、代表的な注意点をまとめておきます。

オーバーヘッド

 パラレルストリームはシーケンシャルなストリームに比べると、かなりのオーバーヘッドが存在します。

 このため、ストリームの要素数が少ない場合、パラレルストリームの方がシーケンシャルなストリームよりパフォーマンスが悪くなります。

 パラレル処理の効果が表れるには、CPUのコア数にもよるのですが、少なくとも万の単位の要素が必要です。

 どうもパフォーマンスが伸びないと感じたら、まずストリームの要素数を確認してみましょう。