最近进公司 学习jdk8性特性,今天对常用的遍历for foreach stream ,parallelStream循环做一个比较:先直接上代码吧:
package cn.com.wangzha.xiaoman.base;
import java.util.ArrayList;
import java.util.List;
import static java.lang.System.err;
import static java.lang.System.out;
/**
* @author zhangkun
* @create 2018-12-15 10:34 AM
* @desc
**/
public class TetsClass3 {
public static void main(String[] args) {
List<String> sourceList = new ArrayList<>();
for (int i = 0; i < 5; i++) {
sourceList.add("第" + i + "条数据");
}
out.println("数据条数:" + sourceList.size());
long a1 = System.currentTimeMillis();
for (int i = 0; i < sourceList.size(); i++) doSome();
long a2 = System.currentTimeMillis();
out.println("普通for循环用时:" + (a2 - a1));
long b1 = System.currentTimeMillis();
for (String t : sourceList) doSome();
long b2 = System.currentTimeMillis();
out.println("增强for循环用时:" + (b2 - b1));
long c1 = System.currentTimeMillis();
sourceList.forEach((t) -> doSome());
long c2 = System.currentTimeMillis();
out.println("forEach循环用时:" + (c2 - c1));
// System.err.println("串行话打印");
long d1 = System.currentTimeMillis();
sourceList.stream().forEach((t)->doSome());//串行话处理
long d2 = System.currentTimeMillis();
out.println("forEach-Stream循环用时:" + (d2 - d1));
long e1 = System.currentTimeMillis();
// System.err.println("并行话打印");
sourceList.parallelStream().forEach((t)->doSome());// 并行化处理
long e2 = System.currentTimeMillis();
out.println("forEach-parallelStream循环用时:" + (e2 - e1));
long f1 = System.currentTimeMillis();
sourceList.parallelStream().forEachOrdered((t)->doSome());//
long f2 = System.currentTimeMillis();
System.out.println("forEachOrdered-parallelStream循环用时:"+(f2-f1));
sourceList.stream().forEach(err::println);
System.err.println("分界线-----------");
sourceList.parallelStream().forEach(j-> out.println(j));//并行化处理
System.err.println("分界线2-----------");
sourceList.parallelStream().forEachOrdered(out::println);
}
private static void doSome(){
try {
Thread.sleep(1); //一毫秒
//out.println(Thread.currentThread());
}catch (Exception e){
e.printStackTrace();
}
}
}
结果:
数据条数:5
普通for循环用时:8
增强for循环用时:6
forEach循环用时:92
forEach-Stream循环用时:10
forEach-parallelStream循环用时:9
第0条数据
第1条数据
第2条数据
第3条数据
第4条数据
分界线-----------
分界线2-----------
forEachOrdered-parallelStream循环用时:9
第1条数据
第0条数据
第2条数据
第3条数据
第4条数据
第0条数据
第1条数据
第2条数据
第3条数据
第4条数据
从上面我们可以看出结果 在数据量少的情况下 增加for 循环>普通for 这个不是重点 数据量大了之后 增加for<普通循环。不过项目中一般for循环不会太大。所以这点效率上不算什么。
forEach-parallelStream for循环>forEach-Stream循环 任何时候。从名称就可以看出来parallelStream是进行并行出来,将一个列表分成多个快,进行并行运行。Stream 是进行串行运行和传统的Iterable 一样。进行封装 效率上可能还没有普通的 for循环高,只是在写法上回更加的简单便捷。Stream 输出时候是有序性集合 parallelStream输出时候是无序集合 如果也想有序可以使用
forEachOrdered-parallelStream 整体上效率也比 stream高一点。不过如果代码循环量中不是太大,印象不会太大,如果专注于并发编程可以多使用这种 从两者的源码也可以比较的出:
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);//stream :false ,parallelStream: true
}
也可以打印一下当前线程就了解了:
结果:
串行话打印
Thread[main,5,main]
forEach循环用时:107
Thread[main,5,main]
Thread[main,5,main]
Thread[main,5,main]
Thread[main,5,main]
Thread[main,5,main]
Thread[main,5,main]
Thread[main,5,main]
Thread[main,5,main]
Thread[main,5,main]
并行话打印
Thread[main,5,main]
分界线-----------
分界线2-----------
Thread[ForkJoinPool.commonPool-worker-2,5,main]
Thread[ForkJoinPool.commonPool-worker-1,5,main]
Thread[ForkJoinPool.commonPool-worker-3,5,main]
Thread[main,5,main]
Thread[ForkJoinPool.commonPool-worker-1,5,main]
Thread[main,5,main]
Thread[ForkJoinPool.commonPool-worker-3,5,main]
Thread[ForkJoinPool.commonPool-worker-2,5,main]
当然这里只做了比较 parallelStream效率, 作为并发编程的流处理重要的类当然 要了解一下他的底层结构:
它通过默认的ForkJoinPool 实现并发 可以参考一下下面文章:
parallelStream 与 ForkJoinPool关系:
https://blog.csdn.net/Darrensty/article/details/79283146
Java 8 中的 Streams API 详解:
https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/
分享到:
评论