JDK8新特性Stream与parallelStream比较

阅读更多
      最近进公司 学习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 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 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/







你可能感兴趣的:(jdk8)