数据并行化是指将数据分红块,为每块数据分配单独的处理单元。《java8函数式编程》书中拿马拉车那个例子打比方,就像从车里取出一些货物,放到另外一辆车上,两辆马车都沿着一样的路径到达目的地,书中画的图也是很容易理解,后面也copy了很多原句。java
当须要在大量数据上执行一样的操做时,数据并行化很管用。它将问题分解为可在多块数 据上求解的形式,而后对每块数据执行运算,最后将各数据块上获得的结果汇总,从而获 得最终答案。这个描述还有点像分治法,或者归并排序。编程
若是已经有一个 Stream 对象,调用它的 parallel 方法就能让其拥有并行操做的能力。若是想从一个集合类建立一个流,调用 parallelStream 就能当即得到一个拥有并行能力的流,使用起来很简单,只要改动一个方法,其余都是同样的,没必要理会串行仍是并行,只要告诉程序怎么作就好了,毕竟告诉计算机作什么和怎么作是两回事。数组
并发化数组操做数据结构
可是有人会问串行和并行哪个快?这就要看具体的环境要求了,主要影响因素以下:并发
数据大小:只有数据足够大、每一个数据处理管道花费的时间足够多 时,并行化处理才有意义。框架
源数据结构:每一个管道的操做都基于一些初始数据源,一般是集合。函数式编程
装箱 处理基本类型比处理装箱类型要快。函数
核的数量:在实践中,核的数量不单指你的机器上有多少核,更是指运行时 你的机器能使用多少核。这也就是说同时运行的其余进程,或者线程关联性(强制线程 在某些核或 CPU 上运行)会影响性能。性能
单元处理开销:花在流中 每一个元素身上的时间越长,并行操做带来的性能提高越明显。线程
书中描述了在底层,并行流沿用了fork/join框架(其实我理解不了)。fork递归式地分解问题,而后每段并行执行,最终由join合并结果,返回最后的值(书中画了一个图)。
将核心类库提供的通用数据结构分红如下三组:
性能好:ArrayList、数组或 IntStream.range,这些数据结构支持随机读取,也就是说它们能轻 而易举地被任意分解。
性能通常:HashSet、TreeSet,这些数据结构不易公平地被分解,可是大多数时候分解是可能的。
性能差:有些数据结构难于分解,好比,可能要花 O(N) 的时间复杂度来分解问题。其中包括 LinkedList,对半分解太难了。还有 Streams.iterate 和 BufferedReader.lines,它们 长度未知,所以很难预测该在哪里分解。
一入Stream有点迷惘,具体这个性能怎么样,还要继续摸索。