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

标签 java performance java-stream

OCP 书中说,默认情况下所有流都是有序的,但可以使用 unordered() 方法将有序流转换为无序流。

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

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

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

PS:我知道并行流在处理小型集合时不会提高性能,但让我们假装我们正在处理非常大的集合。

第二个流仍然是有序的,对吗?那么第一个会有更好的性能吗?

谢谢

最佳答案

您声明所有流都是默认排序的:事实并非如此。例如,如果您的源是 HashSet,则生成的流将不会排序。

关于使并行流无序以“极大地提高性能”的问题:一如既往,当谈到性能时,它取决于(取决于终端操作、中间操作、流的大小等)

The java.util.stream package javadoc给出了一些至少部分回答您的问题的提示:

For parallel streams, relaxing the ordering constraint can sometimes enable more efficient execution. Certain aggregate operations, such as filtering duplicates (distinct()) or grouped reductions (Collectors.groupingBy()) can be implemented more efficiently if ordering of elements is not relevant. Similarly, operations that are intrinsically tied to encounter order, such as limit(), may require buffering to ensure proper ordering, undermining the benefit of parallelism. In cases where the stream has an encounter order, but the user does not particularly care about that encounter order, explicitly de-ordering the stream with unordered() may improve parallel performance for some stateful or terminal operations. However, most stream pipelines, such as the "sum of weight of blocks" example above, still parallelize efficiently even under ordering constraints.

关于java - 这会产生更快的并行流吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44238453/

相关文章:

java - 激活页面时,sling 事件处理程序仅响应一次

java - 垃圾收集与交换、分页之间的关系

java - 使用 Java 8 : Map<String, 基于对象的属性从 Map<String, Set<Object>> 中设置 <Object>> 进行过滤

java - 在运行时生成新的枚举值

java - 如何在 Spring MVC 中查找所有 Controller ?

performance - Oracle/PLSQL 性能

java - Java 8 Stream 中有多个正则表达式从 Line 读取文本

java - 从 Java 8 中的并行流中收集

Java 8 接口(interface)默认方法似乎没有声明属性

java - 从 SQS 检索消息缓慢