Java 8中parallelStream的变异减少

Hea*_*ren 6 java parallel-processing reduce java-8 java-stream

约书亚布洛赫<Effective Java> (Third Edition)提到

Stream的collect方法执行的操作(称为 可变约简)不是并行性的良好候选者,因为组合集合的开销很昂贵.

我阅读了有关Mutable减少的文档,但我仍然不太清楚为什么减少不是并行性的好选择.是synchronization吗?

正如@Ravindra Ranwala指出的那样(我还在减少,并发和订购文档上看到了这一点):

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

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

Rav*_*ala 5

不,这与此无关synchronization.考虑一下有100万个Person物体,需要找出所有people住在纽约的人.那么典型的流管道就是,

people.parallelStream()
    .filter(p -> p.getState().equals("NY"))
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Hearen的"影响力因素"是合并成本.这就是答案.这就是Joshua Bloch的书所说的,这就是文档所说的,这就是这个答案所说的.为什么你坚持认为必须有别的东西? (3认同)