为什么无序流比有序流快

  • 本文关键字:无序 java java-stream
  • 更新时间 :
  • 英文 :


我正在阅读Richard Warburton的Java 8书,并提出了以下内容:

有些操作在有序流上更昂贵。这个问题可能可以通过取消排序来解决。要执行此操作,请调用流的CCD_ 1方法。[…]

我对此感到很困惑。假设我们有Stream<Integer> stream = Arrays.asList(1, 2, 3, 4).stream();

由于List<Integer>定义了流()的相遇顺序,一些)操作可能被低效地执行。为什么?

它是如何影响处理的?是什么使处理速度变慢?为了让事情更快,在这种情况下,我们应该称之为吗

Stream<Integer> stream = Arrays.asList(1, 2, 3, 4).stream().unordered();

听起来很奇怪,至少可以说。。。

这在文档中有详细解释:https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html

订购
流可能有也可能没有定义的相遇顺序。是否流的相遇顺序取决于源和中间操作某些流源(如List或数组)本质上是有序的,而其他(如HashSet)不是一些中间操作,如sorted(),可能会强制在其他无序流上遇到顺序,其他人可能将有序流呈现为无序流,例如BaseStream.ordered()。此外,一些终端操作可能会忽略相遇顺序,例如forEach()。

如果对流进行了排序,则大多数操作都被限制为操作元素的相遇顺序;如果流的源是包含[1,2,3]的列表,然后是执行映射的结果(x->x*2)必须是[2,4,6]。但是,如果来源没有定义的遭遇顺序,则值[2,4,6]的任何排列都将是有效的后果对于顺序流,是否存在相遇顺序不影响性能,只影响决定论。如果流被排序,在同一个上重复执行相同的流管道源将产生相同的结果;如果它没有被命令,重复执行可能会产生不同的结果。

对于并行流,放松排序约束有时可以实现更高效的执行某些聚合操作,例如筛选重复项(distinct())或分组缩减如果元素的排序是不相关的。类似地本质上与相遇顺序相关,如limit(),可能需要缓冲以确保正确的排序,破坏并行性如果流有相遇顺序,但用户并不特别关心相遇顺序使用unrdered()对流进行去排序可以提高并行性某些有状态或终端操作的性能然而,大多数流管道,例如上面的"块的重量总和"示例,即使在排序约束下仍然有效地并行化。

最新更新