OCP书中说默认排序所有流,但可以使用无序()方法将有序流转换为无序流。
它还说当我在调用parallel()终端操作之前将此方法用作中间操作时,此方法可以极大地提高性能。我的问题是:下面的并行流会比那个下面的并行流更快吗?
Arrays.asList(1,2,3,4,5,6).stream().unordered().parallel()
Arrays.asList(1,2,3,4,5,6).parallelStream().
PS:我知道在使用小型集合时,并行流程可以提高性能,但我们假设我们正在使用非常大的集合。
第二个流还在订购吗?那么第一个会有更好的表现吗?
谢谢
答案 0 :(得分:3)
您声明默认情况下会对所有流进行排序:情况并非如此。例如,如果您的来源是HashSet
,则不会对结果流进行排序。
关于使并行流无序的问题"大大提高性能":一如既往的性能,它取决于(关于终端操作,中间操作,大小)流等。)
The java.util.stream
package javadoc给出了一些回答你问题的建议,至少部分是:
对于并行流,放宽排序约束有时可以实现更高效的执行。如果元素的排序不相关,则可以更有效地实现某些聚合操作,例如过滤重复项(
distinct()
)或分组缩减(Collectors.groupingBy()
)。类似地,与遇到顺序有内在联系的操作(例如limit()
)可能需要缓冲以确保正确排序,从而破坏并行性的好处。在流具有遭遇顺序但用户并不特别关心该遭遇顺序的情况下,使用unordered()
显式地对流进行排序可以改善某些有状态或终端操作的并行性能。但是,大多数流管道,例如块的重量总和"上面的示例,即使在排序约束下仍然可以高效并行化。
答案 1 :(得分:0)
对于您在此处显示的情况,绝对不是。这里的元素太少了。一般来说,你应该测量然后得出结论,但这个几乎是不费脑子的。
另请阅读:Parallel Processing
关于unordered
的事情是在执行终端操作时,Stream管道必须提及订单 - 这意味着额外的成本。如果没有维护订单,则流更快。
请注意,一旦您致电unordered
,就无法获得该订单。你可以排序,但这可能并不意味着最初的订单。
例如,findFirst
和findAny
在并行流程中也是如此。