performance - allMatch、noneMatch、filter 和 map 的 Java 流并行行为

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

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

我假设,但想知道是否有人可以验证 noneMatchallMatch 是否也以这种方式运行,所以如果在运行 noneMatch 时,一个线程找到实际匹配项,然后操作可以返回 false。那么所有其他线程是否以与 anyMatch 相同的方式定期检查它?类似地,反转是否适用于 allMatch

此外,我想知道在并行运行 filtermap 操作时,它们是在有序流上运行还是在无序流上运行时是否存在任何差异。在有序流上,我假设最合乎逻辑的好处就是不同的线程可以处理创建的每个子流,然后以相同的顺序将它们全部合并回一起。对于无序流,这对我难以想到的此类操作有任何优势吗?

最佳答案

所有三个 anyMatchallMatchnoneMatch 都是使用相同的 MatchOps 实现的设置不同标志的类。所以他们以非常相似的方式工作。它们都是短路且无序的,因此无论您的流源是否有序都没有关系:这些操作将执行得同样快。

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

关于performance - allMatch、noneMatch、filter 和 map 的 Java 流并行行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34924008/

相关文章:

javascript - CSS sprites 有什么好的替代品吗?

c# - CancellationToken Cancel 不脱离 BlockingCollection

matlab - Matlab中如何使用GPU的共享内存?

java - 如何将 BufferedImage 保存为低于特定大小

java - 如何减少列表以使用 Java 函数式 API 进行映射

javascript - 在 JS 中避免没有最终表达式的 FOR 循环是否有充分的理由?

c++ - 在 C/C++ 中访问 c​​onst 变量的速度

c# - 与数组相比,使用 IEnumerable 有哪些优势?

perl - 如何在不发生冲突的情况下对文件进行并行写访问?

java流操作检查并返回特定对象