并行数据处理与性能

并行流 parallel()

  1. 如果每次应用函数都要依赖前一次应用的结果,并行只会比顺序处理增加开销。
    错用并行流的首要原因,就是使用的算法改变了某些共享状态。因为每次访问共享状态都会出现数据竞争,如果尝试使用类似synchronize方式修复,就失去并行的意义了。
  2. 自动装箱和拆箱会大大降低性能,但凡有可能应该使用原始类型流。
  3. 特别是limit和findFirst依赖顺序的操作,本身并行性能就比顺序流差。
  4. 单个元素的处理成本也大,元素的数量越多,并行处理的性能提高可能性越大。
  5. 元素的数据结构是否容易拆分,例如ArrayList拆分效率比LinkedList高的多,因为前者可以随机访问拆分,后者必须遍历拆分。
  6. 还要考虑collector合并combiner方法的代价,combiner代价是否会大于并行流得到的性能提升。

总结:

并行化不是没有代价的,最重要的是保证并行执行工作的时间比在内核之间传输数据的时间要长。
并行流背后的基础架构就是Java7的fork/join框架。

fork/join框架

// 使用这个框架,必须创建RecursiveTask的子类,R是任务返回的结果类型,如果返回时void,就是RecursiveAction类型。
public abstract class RecursiveTask {
  // 要实现的唯一抽象方法compute
  protected abstract R compute();
  // 例如:
  @Override
  public R compute() {
    if (任务足够小不可分) {
      // 顺序计算该任务
    }
    else {
      // 将任务分成2个子任务,递归调用compute拆分子任务,
      // 等待所有子任务完成,合并每个子任务的结果
      ...
  }
}

你可能感兴趣的:(并行数据处理与性能)