当前位置: 首页 > 知识库问答 >
问题:

无序和并行时的Java流限制和跳过行为

薛鹏飞
2023-03-14

因此,我一直在尝试并行运行流,并基于API文档和我阅读的其他支持材料监视它们的行为。

我创建了两个并行流并运行distince(),其中一个流是有序的,另一个是无序的。然后,我使用foreachOrdered()打印结果(以确保在distinct运行后看到流的最终遇到顺序),并且可以清楚地看到无序版本并不保持原始顺序,但具有较大的数据集,将明显提高并行性能

有API注释建议,当流无序时,limit()skip()操作也应该更有效地并行运行,因为您不必检索第一个n元素,而可以获取任何n元素。我已经尝试用与上面相同的方式来模拟这一点,但是同时与有序流和无序流并行运行时的结果总是相同的。换句话说,当我在运行限制后打印出结果时,即使是无序(并行)流,它仍然总是选择前n个元素?

有人能解释一下吗?我尝试改变输入数据集的大小和n的值,结果没有什么不同。我以为它会抓取任何n个元素并优化并行性能?有没有人在实践中真正看到过这种情况,并且有可能提供一个持续展示这种行为的解决方案?

共有1个答案

俞学
2023-03-14

您可能试图从已调整大小/已补贴的源(如ArrayList.stream()Arrays.stream(array)IntStream.Range()等)创建流,然后立即执行LimitSkip操作。这种情况是在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(..)...

或者,您可以使用非补贴源(例如,treesethashset)进行测试。

 类似资料:
  • 问题内容: 为什么下面的代码不输出任何输出,而如果我们删除parallel,则输出0、1? 尽管我知道理想情况下应该将限制放在不同的位置,但是我的问题与添加并行处理导致的差异更多有关。 问题答案: 真正的原因是 有序并行 是完整的屏障操作,如文档中所述: 保持并行管道的稳定性是相对昂贵的(要求操作充当一个完整的屏障,并具有大量缓冲开销),并且通常不需要稳定性。 “完全屏障操作”是指必须先执行所有上

  • 问题内容: 我试图弄清楚如何在Java 8并行流中复制ThreadLocal值。 因此,如果我们考虑到这一点: 哪个输出 有没有办法将ThreadLocal从main()方法克隆到为每次并行执行生成的线程中? 这样,我的结果是: 而不是第一个? 问题答案: 正如Louis在评论中所述,您的示例可以简化为捕获lambda表达式中的局部变量的值 从您的示例中看不出完整的用例是什么。 如果您确切知道将从

  • 我试图理解为什么下面的Java程序给出了< code>OutOfMemoryError,而对应的程序却没有< code >。parallel()没有。 我有两个问题: > 该程序的预期输出是什么? 不带<代码>。parallel()看起来这只是输出< code>sum(1 2 3...)这意味着它只是“停留”在平面图中的第一个流,这是有意义的。 对于并行,我不知道是否有预期的行为,但我的猜测是它以

  • 问题内容: 基本上,这是在尝试回答另一个问题时出现的。假设此代码: 我了解以下事实:这是 无序的无限流 ,要使其完成,必须进行短路操作(在这种情况下)。我也了解,在达到该限制之前,可以随意调用Stream实现多次。 在java-8下运行此命令,将始终打印(可能不总是打印,但在我的机器上是这样)。 相反,在java-10下运行this很少超过。所以我的问题是内部发生了什么变化,从而使短路发生得更好了

  • 将此流收集到列表中 正如我所看到的,infinity循环有一些问题,所以peek()打印范围内的数字(12,99),这是可以的,但之后它再次打印范围内的数字(11,98),等等,你能解释一下我在哪里犯了错误吗?

  • 脚本是一个命令一个命令顺序执行的。 Selenese 本身不支持条件语句(if - else, 等)或循环迭代(for, while, 等)。没有流程控制也可以制作很多有用的测试案例。然而,对于动态内容的功能测试,可能涉及到多个页面,编程逻辑通常是必要的。 如果必须使用流程控制,有以下三种解决方案: 使用 Selenium RC 运行脚本结合客户端库,如:Java 或 PHP 库,利用编程语言的流