这会产生更快的并行流吗?

时间:2017-05-29 08:58:56

标签: java performance java-stream

OCP书中说默认排序所有流,但可以使用无序()方法将有序流转换为无序流。

它还说当我在调用parallel()终端操作之前将此方法用作中间操作时,此方法可以极大地提高性能。我的问题是:下面的并行流会比那个下面的并行流更快吗?

Arrays.asList(1,2,3,4,5,6).stream().unordered().parallel()

Arrays.asList(1,2,3,4,5,6).parallelStream().

PS:我知道在使用小型集合时,并行流程可以提高性能,但我们假设我们正在使用非常大的集合。

第二个流还在订购吗?那么第一个会有更好的表现吗?

谢谢

2 个答案:

答案 0 :(得分:3)

您声明默认情况下会对所有流进行排序:情况并非如此。例如,如果您的来源是HashSet,则不会对结果流进行排序。

关于使并行流无序的问题"大大提高性能":一如既往的性能,它取决于(关于终端操作,中间操作,大小)流等。)

The java.util.stream package javadoc给出了一些回答你问题的建议,至少部分是:

  

对于并行流,放宽排序约束有时可以实现更高效的执行。如果元素的排序不相关,则可以更有效地实现某些聚合操作,例如过滤重复项(distinct())或分组缩减(Collectors.groupingBy())。类似地,与遇到顺序有内在联系的操作(例如limit())可能需要缓冲以确保正确排序,从而破坏并行性的好处。在流具有遭遇顺序但用户并不特别关心该遭遇顺序的情况下,使用unordered()显式地对流进行排序可以改善某些有状态或终端操作的并行性能。但是,大多数流管道,例如块的重量总和"上面的示例,即使在排序约束下仍然可以高效并行化。

答案 1 :(得分:0)

对于您在此处显示的情况,绝对不是。这里的元素太少了。一般来说,你应该测量然后得出结论,但这个几乎是不费脑子的。

另请阅读:Parallel Processing

关于unordered的事情是执行终端操作时,Stream管道必须提及订单 - 这意味着额外的成本。如果没有维护订单,则流更快。

请注意,一旦您致电unordered,就无法获得该订单。你可以排序,但这可能并不意味着最初的订单。

例如,findFirstfindAny在并行流程中也是如此。