Stream 的并行靠 Spliterator 拆数据源。不同数据源的特征位、拆分方式差在哪?拆不动会怎样?这篇把它们一个个打印出来(惰性与短路见前面 Stream 一篇)。
ArrayList ORDERED SIZED SUBSIZED LinkedList ORDERED SIZED SUBSIZED HashSet DISTINCT SIZED TreeSet ORDERED DISTINCT SORTED SIZED ArrayDeque ORDERED SIZED NONNULL SUBSIZED IntStream.range ORDERED DISTINCT SORTED SIZED NONNULL IMMUTABLE SUBSIZED Stream.iterate ORDERED IMMUTABLE filter 之后 ORDERED
各来源连续 trySplit 6 次,每次拆出的前半部分元素个数(estimateSize,N = 10000):
ArrayList [5000, 2500, 1250, 625, 312, 156]
LinkedList [1024, 2048, 3072, 3856, -1]
HashSet [5000, 2500, 1250, 625, 312, 156](HashSet 的 estimateSize 是剩余元素数)
TreeSet [5000, 2500, 1250, 625, 312, 156]
Stream.iterate 无限流 [4611686018427387903, 4611686018427387903, 4611686018427387903, 4611686018427387903](-2 表示大小未知 Long.MAX_VALUE)自定义 Spliterator,trySplit 正常二分:并行流用了 10 个线程,耗时 107 ms(sum=99870) 自定义 Spliterator,trySplit 直接返回 null:并行流用了 1 个线程,耗时 658 ms(sum=99870) ArrayList 20 万个元素 parallelStream:用了 10 个线程,耗时 98 ms LinkedList 20 万个元素 parallelStream:用了 10 个线程,耗时 90 ms