【问题标题】:Java stream parallel behaviour for allMatch, noneMatch, filter and mapallMatch、noneMatch、filter 和 map 的 Java 流并行行为
【发布时间】:2016-01-21 12:35:35
【问题描述】:

我在另一篇文章中读到,经过调查发现,anyMatch 终端操作的工作方式是每个线程(在子流上操作)定期检查其他线程是否找到结果,如果是,则所有其他线程都停止了。

我假设,但想知道是否有人可以验证noneMatchallMatch 是否也以这种方式运行,因此如果在运行noneMatch 时,一个线程找到了实际匹配,那么该操作可以返回false。那么所有其他线程是否以与anyMatch 相同的方式定期检查这一点?同样,逆向适用于allMatch

此外,我想知道在并行运行filtermap 操作时,它们是在有序流上运行还是在无序流上运行有什么区别。在有序流上,我认为最合乎逻辑的好处就是不同的线程可以处理创建的每个子流,然后以相同的顺序将它们全部合并在一起。对于一个无序的流,这对我难以想象的操作有什么好处吗?

【问题讨论】:

    标签: performance parallel-processing java-8 java-stream behavior


    【解决方案1】:

    所有三个anyMatchallMatchnoneMatch 都是使用具有不同标志集的相同MatchOps 类实现的。所以它们以非常相似的方式工作。所有这些都是短路且未排序的,因此您的流源是否排序无关紧要:这些操作的执行速度同样快。

    mapfilter 这样的操作对无序源没有任何好处。无序源更改了distinctlimitskiptakeWhile (Java-9)、dropWhile (Java-9) 的算法。似乎正常减少(通过reducecollect)不会优化无序情况(尽管我非常初步的研究表明这种优化是可能的)。

    【讨论】:

    • 这是一个很棒的回复 - 非常感谢!所以澄清一下,allMatch 和 noneMatch 在并行运行时将为每个子流检查其他线程是否能够定义早期结果?
    • 此外,如何通过grep找到findFirst等方法的实际源代码?该方法的实际实现在哪个特定类中?
    • @user3780370,是的,其他线程在allMatch/noneMatch 中检查早期结果。 Grep 可能会有所帮助,但通常我使用 IDE 功能导航到 JDK 代码。 Eclipse 和 IDEA 都可以很舒服地做到这一点。
    • 我现在正在通过 Eclipse 查看 - 如果源代码无序,您在哪里找到 findFind() 变为 findAny() 的事实?指定的特定源代码在哪里,即特定的类和方法?提前致谢。
    • @user3780370,哎呀,我错了! findFirst 未针对无序源进行优化。 Posted a patch,希望能被采纳。
    猜你喜欢
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    相关资源
    最近更新 更多