Java Lambda从入门到精通二十一 并行流

到本章节之前Lambda的内容已经基本差不多讲完了,还剩下一个内容就是:并行流。

并行流

并行流也就是使用流进行的并行计算,并行的目的就是利用计算机多核,将任务拆分成多个小的数据块,同时计算,最后再将拆分结果合并,形成最终结果。

我们前面章节使用的都是顺序流,要转为并行流也很简单,那就是调用流的parallel()方法。

例如:

long start111 = System.currentTimeMillis();
long sum1 = LongStream.rangeClosed(1, 100000L).parallel().reduce(0L,Long::sum);
System.out.println("并行求和1-10w所用时间:"+String.valueOf(System.currentTimeMillis()-start111));
System.out.println("并行求和1-10w结果:"+sum1);

顺序流和并行流的区别就在于调用流的相关方法中是否调用了parallel()方法。

并行流性能

在使用并行流的时候,特别需要注意性能,并不是用了并行流就必然会提升性能,很多时候性能反而会下降。

我们就拿上面的例子和顺序计算的方式来对比一下性能。

long start111 = System.currentTimeMillis();
long sum1 = LongStream.rangeClosed(1, 100000L).parallel().reduce(0L,Long::sum);
System.out.println("并行求和1-10w所用时间:"+String.valueOf(System.currentTimeMillis()-start111));
System.out.println("并行求和1-10w结果:"+sum1);

System.out.println("--------------------------------------");
long sum2 =0L;
long start222 = System.currentTimeMillis();
for(long i=1; i<=100000L; i++) {
	sum2 +=i;
}
System.out.println("顺序求和1-10w所用时间:"+String.valueOf(System.currentTimeMillis()-start222));
System.out.println("顺序求和1-10w结果:"+sum2);
System.out.println("--------------------------------------");

输出结果:

并行求和1-10w所用时间:52
并行求和1-10w结果:5000050000
--------------------------------------
顺序求和1-10w所用时间:1
顺序求和1-10w结果:5000050000
--------------------------------------
顺序Lambda求和1-10w所用时间:5
顺序Lambda求和1-10w结果:5000050000
--------------------------------------

通过结果我们看到,并行流求和1-10w,性能远不如非lambda的顺序求和的性能。所以并行并不是没有代价的,在使用并行流的时候,需要对性能做好评估,不然会适得其反。

我们分别将数据取3个范围求和,测试的性能如下:

并行求和1-10w所用时间:52
并行求和1-10w结果:5000050000
--------------------------------------
顺序求和1-10w所用时间:1
顺序求和1-10w结果:5000050000
--------------------------------------
顺序Lambda求和1-10w所用时间:5
顺序Lambda求和1-10w结果:5000050000
--------------------------------------

并行求和1-100w所用时间:16
并行求和1-100w结果:500000500000
--------------------------------------
顺序求和1-100w所用时间:8
顺序求和1-100w结果:500000500000
--------------------------------------
顺序Lambda求和1-100w所用时间:5
顺序Lambda求和1-100w结果:500000500000
--------------------------------------

并行求和1-1亿所用时间:174
并行求和1-1亿结果:5000000050000000
--------------------------------------
顺序求和1-1亿所用时间:32
顺序求和1-1亿结果:5000000050000000
--------------------------------------
顺序Lambda求和1-1亿所用时间:321
顺序Lambda求和1-1亿结果:5000000050000000

从结果看出在不同量级的数据上,不同用法的性能表现也不一样。