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) { ListsourceList = 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 StreamparallelStream() { 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/