local_8080 2022-06-09 09:45 采纳率: 0%
浏览 108

stream与for循环性能问题

在翻看运维系统时,引发的思考,下图的代码换成for循环在性能方面是否会好一些?

img

自己写的测试代码,但是不知道是否具有代表性

@Test
    public void groupList() {
        ArrayList<Integer> integers = new ArrayList<>();
        for (int i = 0; i < 10000000; i++) {
            integers.add(1);
            integers.add(2);
            integers.add(3);
            integers.add(4);
            integers.add(5);
            integers.add(6);
            integers.add(6);
        }
        System.out.println("集合大小------------>"+integers.size());
//-----------------------------------------------------------------------------
        long l3 = System.currentTimeMillis();
        ArrayList<Integer> integers1 = new ArrayList<>();
        for (int i = 0; i < integers.size(); i++) {
        if (integers.get(i)>0){integers1.add(integers.get(i));}}
        long l4 = System.currentTimeMillis();
        System.out.println("普通for用时:"+(l4-l3));
        System.out.println("普通for大小:"+integers1.size());
//-----------------------------------------------------------------------------
        long l5 = System.currentTimeMillis();
        ArrayList<Integer> integers2 = new ArrayList<>();
        for (Integer integer : integers) {
        if (integer>0){integers2.add(integer);}}
        long l6 = System.currentTimeMillis();
        System.out.println("增强for用时:"+(l6-l5));
        System.out.println("增强for大小:"+integers2.size());
//-----------------------------------------------------------------------------
        long l1 = System.currentTimeMillis();
        List<Integer> collect = integers.stream().filter(x -> x > 0).collect(Collectors.toList());
        long l2 = System.currentTimeMillis();
        System.out.println("stream.filter用时:"+(l2-l1));
        System.out.println("stream.filter大小:"+collect.size());
//-----------------------------------------------------------------------------
        long l7 = System.currentTimeMillis();
        List<Integer> collect2 = integers.stream().map(x -> (x > 0) ? x : 1).collect(Collectors.toList());
        long l8 = System.currentTimeMillis();
        System.out.println("stream.map用时:"+(l8-l7));
        System.out.println("stream.map大小:"+collect2.size());
    }

结果如下:

集合大小------------>70000000
普通for用时:12172
普通for大小:70000000
增强for用时:812
增强for大小:70000000
stream.filter用时:21988
stream.filter大小:70000000
stream.map用时:3724
stream.map大小:70000000
我想问下各位,在什么情况下,stream会比for循环的效率高(不考虑代码的整洁性)
  • 写回答

1条回答 默认 最新

  • 皮蛋不吃粥 2022-06-09 10:02
    关注

    Stream可以用并行流,在大量数据的时候,性能都是远超for和foreach

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月9日

悬赏问题

  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?