Tra*_*ity 5 java parallel-processing java-8 java-stream
所以我一直在玩并行运行流,并根据API文档和我读过的其他支持材料监控它们的行为.
我创建了两个并行流并运行distinct(),一个是流的顺序,另一个是无序流.然后我使用打印结果forEachOrdered()(以确保我看到在运行之后生成的流的遇到顺序),并且可以清楚地看到无序版本不保持原始排序,但是使用大型数据集,显然会增强并行性能.
有一些API说明表明,当流是无序的时,limit()和skip()操作也应该并行运行,而不是必须检索第一个n元素,你可以得到任何n元素.我试图以与上面相同的方式模拟这个,但是当与有序和无序流并行运行时的结果总是相同的.换句话说,当我在运行限制后打印出结果时,即使对于无序(并行)流,它仍然总是选择前n个元素?
有谁能解释一下?我尝试改变输入数据集的大小和n的值,它没有任何区别.我本以为它会抓住任何n个元素并优化并行性能?有没有人在实践中看到过这种情况,并且可能提供一种能够始终如一地展示这种行为的解决方案?
你可能想创建SIZED / SUBSIZED源(如流arrayList.stream(),Arrays.stream(array),IntStream.range(),等),并立即发出limit或skip操作。这种情况在limit/skip实现中进行了特别优化(参见SliceOps),并且对于有序和无序流以相同的速度运行(实际上运行速度非常快)。如果您删除这些特征(例如,添加过滤步骤),您会发现在此之后使流无序确实有帮助。像这样写测试:
input.stream().parallel().filter(x -> true).skip(..)...
input.stream().parallel().unordered().filter(x -> true).skip(..)...
input.stream().parallel().filter(x -> true).limit(..)...
input.stream().parallel().unordered().filter(x -> true).limit(..)...
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用非 SUBSIZED 源(例如,TreeSet或HashSet)进行测试。
| 归档时间: |
|
| 查看次数: |
556 次 |
| 最近记录: |