stream的效率问题

近期看来有些文章说stream使java循环效率慢30倍,因此写以下代码做对比。
定义一下自定义类型:

@Data
public class StreamEntity {

    private Long id;

    private String  name;

    private Integer value;
}

测试类:

public class StreamTest {

    public  static void  main(String [] arges) {
        //造两个30000的集合  一个简单类型 一个自定义类型
        List<Integer> integerList = Lists.newArrayList();
        List<StreamEntity> streamEntityList = Lists.newArrayList();
        Random random = new Random();
        for (int i = 0; i < 30000; i++) {
            Integer number =random.nextInt(30000);
            integerList.add(number);
            StreamEntity streamEntity = new StreamEntity();
            streamEntity.setId(Long.valueOf(number));
            streamEntity.setName(String.valueOf(number));
            streamEntity.setValue(number);
            streamEntityList.add(streamEntity);
        }
        //简单集合
        long prevTime1 = System.currentTimeMillis();
        Integer result1= integerList.get(0);
        for(int i =0;i<integerList.size();i++){
            int j = integerList.get(i);
            if(j>result1){
                result1 =j;
            }
        }
         System.out.println("简单集合普通for循环计算耗时:"+(System.currentTimeMillis() -prevTime1)+" 结果:"+result1);
         long prevTime2 = System.currentTimeMillis();
         Integer result2 = integerList.stream().mapToInt(v->v).max().getAsInt();
         System.out.println("简单集合单线程stream计算耗时:"+ (System.currentTimeMillis() - prevTime2)+" 结果:"+result2);

        long prevTime3 = System.currentTimeMillis();
        Integer sum3 = integerList.parallelStream().mapToInt(v->v).max().getAsInt();
        System.out.println("简单集合多线程stream计算耗时:"+(System.currentTimeMillis() - prevTime3)+" 结果:"+sum3);
       // 自定义集合
        long prevTime4 = System.currentTimeMillis();
        Integer result4=streamEntityList.get(0).getValue();
        for(int i =0;i<streamEntityList.size();i++){
            StreamEntity streamEntity = streamEntityList.get(i);
            if(result4<streamEntity.getValue()){
                result4 = streamEntity.getValue();
            }
        }
        System.out.println("自定义集合普通for循环环计算耗时:"+(System.currentTimeMillis() -prevTime4)+" 结果:"+result4);
        long prevTime5 = System.currentTimeMillis();
        Integer result5 =  streamEntityList.stream().mapToInt(v->v.getValue()).max().getAsInt();
        System.out.println("自定义集合单线程stream计算耗时:"+ (System.currentTimeMillis() - prevTime5)+" 结果:"+result5);

        long prevTime6 = System.currentTimeMillis();
        Integer result6 = streamEntityList.parallelStream().mapToInt(v->v.getValue()).max().getAsInt();
        System.out.println("自定义集合多线程stream计算耗时:"+(System.currentTimeMillis() - prevTime6)+" 结果:"+result6);

    }

}

运行结果(个人电脑配置可能会影响运行结果请多次试验):
stream的效率问题_第1张图片
因此个人觉得 关于stream的效率问题要有分类的对比说明。
关于以上的对比结果简单总结:
对于简单操作,比如最简单的遍历求最大值,Stream串行API性能明显差于普通for循环,但并行的Stream API能够发挥多核特性。
对于复杂操作,Stream串行API性能可以和普通遍历相差不大,在并行执行时Stream 效果优于其他另个。(注:并行流的内部使用了默认的 ForkJoinPool(java1.7添加) 分支/合并框架,它的默认线程数量就是你的处理器数量)
如果出于性能考虑,

  1. 对于简单操作推荐使用外部迭代手动实现,
  2. 对于复杂操作,推荐使用Stream API,
  3. 在多核情况下,推荐使用并行Stream API来发挥多核优势,
  4. 单核情况下不建议使用并行Stream API。

如果出于代码简洁性考虑,
使用Stream API能够写出更短的代码。即使是从性能方面说,尽可能的使用Stream API也另外一个优势,那就是只要Java Stream类库做了升级优化,代码不用做任何修改就能享受到升级带来的好处。

你可能感兴趣的:(java基础)