【问题标题】:Mutation reductions for parallelStream in Java 8Java 8 中 parallelStream 的变异减少
【发布时间】:2018-11-24 22:07:01
【问题描述】:

Joshua Bloch<Effective Java> (Third Edition) 中提到

Stream 的 collect 方法执行的操作(称为 mutable reductions)不适合并行化,因为组合集合的开销很高。

我阅读了Mutable reduction 上的文档,但我仍然不太确定为什么减少不是并行性的好候选者。是synchronization 吗?

正如@Ravindra Ranwala 指出的那样(我也在Reduction, concurrency, and ordering 文档上看到了这一点):

并行执行操作实际上可能会适得其反。这是因为对于某些 Map 实现而言,组合步骤(通过键将一个 Map 合并到另一个 Map)可能昂贵

如果是这样,那么是否还有其他主要因素我们需要关注可能会导致性能低下?

【问题讨论】:

    标签: java parallel-processing java-8 java-stream reduce


    【解决方案1】:

    不,这与synchronization无关。假设您有 100 万个 Person 对象,需要找出所有住在纽约的 people。所以一个典型的流管道是,

    people.parallelStream()
        .filter(p -> p.getState().equals("NY"))
        .collect(Collectors.toList());
    

    考虑并行执行此查询。假设我们有 10 个线程并行执行它。每个线程都会将它自己的数据集累积到一个单独的本地容器中。最后将 10 个结果容器合并为一个大容器。此合并成本很高,并且是并行执行引入的附加步骤。因此并行执行可能并不总是更快。有时顺序执行可能比它的并行计数器部分更快。

    所以总是从顺序执行开始。如果这只是有意义的,您可能会在稍后的某个时间点回退到它的平行对应物。

    【讨论】:

    • 谢谢,我在文档中读到了。还有其他我们需要考虑的影响因素吗?
    • 谢谢,至于 faster 我想我现在不在这里问了。 faster 可能是由许多其他因素引起的,例如 splitting 机制、线程 上下文切换。我真正想问的是减少突变对性能下降的影响因素是什么?这里只考虑减少突变。
    • @听到“影响因素”是合并成本。这就是答案。这是 Joshua Bloch 的书所说的,是文档所说的,也是这个答案所说的。你为什么坚持假设一定有别的东西?
    • @Holger 我明白了,是的,你是对的。对不起我的粗鲁和误解。非常感谢你清除了我脑海中的模糊。谢谢你,霍尔格。
    • 我敢打赌,如果你有 100 万人,但只有少数人住在纽约,并行版本会更快。
    猜你喜欢
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 2013-11-01
    • 2015-11-05
    • 1970-01-01
    • 2014-05-27
    • 2023-03-26
    相关资源
    最近更新 更多