JAVA 中Stream()与ParallelStream()的区别

3,907 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

前言:最近在使用流式编程的Stream()时候发现使用ParallelStream()在读取文件时的速度更快。对此我Stream和ParallelStream做出了比较已经他们的引用场景。

区别:对于Stream他的处理方式为单管道的串行流,是进行无序的处理。ParallelStream的处理方式则是多管道的并行流。

代码展示:

这边我先定义了一个Integer类型的数组,因为是插入所以使用的是LinkedList

public static List<Integer> buildIntLists() {
    long startLinked = System.currentTimeMillis();
    List<Integer> linkedList =new LinkedList();
    for (int a = 1;a <=10000 ;a++) {
        linkedList.add(a);
    }
    System.out.println("创建LinkedList : " + (System.currentTimeMillis() - startLinked) + "ms");
    return Collections.unmodifiableList(linkedList);
}

List<Integer> integerList = buildIntLists();

System.out.println("打印:"+integerList.toString());

// 首先我们用传统的for循环遍历(目前我都试过一般的循环体系中最原始的for是循环语句中执行效率最快的),这边实现的时候执行一次让他sleep1毫秒代码如下:
long start = System.currentTimeMillis();
for (int a = 0; a < integerList.size(); a++) {
    try {
        TimeUnit.MILLISECONDS.sleep(1);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

System.out.println("for循环遍历方式 : " + (System.currentTimeMillis() - start) + "ms");


// 其次我们来用Stream的forEach来实现,还是老样子执行一次让他sleep1毫秒代码如下:
start = System.currentTimeMillis();
integerList.stream().forEach(r -> {
    try {
        TimeUnit.MILLISECONDS.sleep(1);
    } catch (Exception e) {
        e.printStackTrace();
    }
});

System.out.println("stream : " + (System.currentTimeMillis() - start) + "ms");

// 最后我们来用parallelStream的forEach来实现,还是老样子执行一次让他sleep1毫秒代码如下:
start = System.currentTimeMillis();
integerList.parallelStream().forEach(r -> {
    try {
        TimeUnit.MILLISECONDS.sleep(1);
    } catch (Exception e) {
        e.printStackTrace();
    }
});

System.out.println("parallelStream : " + (System.currentTimeMillis() - start) + "ms");

执行后的结果如下:

image.png

从上可以看出,Stream的效率没有ParallelStream的效率高,补充:这边更具官网的资料提供,有说会更具电脑的核数有做更变,如:我的电脑目前是8核的他的读取速度在196ms左右,那么我的电脑如果是16核的话他的处理时间会明显的小于196ms。

总结:从上可以看出ParallelStream和Stream的效率,是ParallelStream远大于Stream的。但是写代码最重要的是要更具实际情况来做技术区分,ParallelStream既然是并行的,那么他的使用就会有一定的场景限制,我们应该从的场景加一下考虑,1.当前程序是否需要支持并行。2.既然涉及到多核那么势必会设计到多线程关系也就是是否会出现竞争关系。3.在执行的时候是否需要有序等。一般情况下满足以上的三种,我们可以选择ParallelStream。