恕我直言你可能真的不会java第6篇:Stream性能差?不要人云亦云(1)

文末

我将这三次阿里面试的题目全部分专题整理出来,并附带上详细的答案解析,生成了一份PDF文档

  • 第一个要分享给大家的就是算法和数据结构

网易严选Java开发三面面经:HashMap+JVM+索引+消息队列

  • 第二个就是数据库的高频知识点与性能优化

网易严选Java开发三面面经:HashMap+JVM+索引+消息队列

  • 第三个则是并发编程(72个知识点学习)

网易严选Java开发三面面经:HashMap+JVM+索引+消息队列

  • 最后一个是各大JAVA架构专题的面试点+解析+我的一些学习的书籍资料

网易严选Java开发三面面经:HashMap+JVM+索引+消息队列

还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • Stream串行流的执行效率大于等于普通for循环

  • Stream并行流计算 > Stream串行流计算 >= 普通for循环

四、最终测试结论


  • 对于简单的数字(list-Int)遍历,普通for循环效率的确比Stream串行流执行效率高(1.5-2.5倍)。但是Stream流可以利用并行执行的方式发挥CPU的多核优势,因此并行流计算执行效率高于for循环。

  • 对于list-Object类型的数据遍历,普通for循环和Stream串行流比也没有任何优势可言,更不用提Stream并行流计算。

虽然在不同的场景、不同的数据结构、不同的硬件环境下。Stream流与for循环性能测试结果差异较大,甚至发生逆转。但是总体上而言

  • Stream并行流计算 >> 普通for循环 ~= Stream串行流计算 (之所以用两个大于号,你细品)

  • 数据容量越大,Stream流的执行效率越高。

  • Stream并行流计算通常能够比较好的利用CPU的多核优势。CPU核心越多,Stream并行流计算效率越高。

stream比for循环慢5倍?也许吧,单核CPU、串行Stream的int类型数据遍历?我没试过这种场景,但是我知道这不是应用系统的核心场景。看了十几篇测试博文,和我的测试结果。我的结论是: 在大多数的核心业务场景下及常用数据结构下,Stream的执行效率比for循环更高。 毕竟我们的业务中通常是实实在在的实体对象,没事谁总对List<Int>类型进行遍历?谁的生产服务器是单核?。

五、测试代码



<dependency>

    <groupId>com.github.houbb</groupId>

    <artifactId>junitperf</artifactId>

    <version>2.0.0</version>

</dependency>

测试用例一:


import com.github.houbb.junitperf.core.annotation.JunitPerfConfig;

import com.github.houbb.junitperf.core.report.impl.HtmlReporter;

import org.junit.jupiter.api.BeforeAll;



import java.util.Arrays;

import java.util.Random;



public class StreamIntTest {



    public static int[] arr;



    @BeforeAll

    public static void init() {

        arr = new int[500000000];  //5亿个随机Int

        randomInt(arr);

    }



    @JunitPerfConfig( warmUp = 1000, reporter = {HtmlReporter.class})

    public void testIntFor() {

        minIntFor(arr);

    }



    @JunitPerfConfig( warmUp = 1000, reporter = {HtmlReporter.class})

    public void testIntParallelStream() {

        minIntParallelStream(arr);

    }



    @JunitPerfConfig( warmUp = 1000, reporter = {HtmlReporter.class})

    public void testIntStream() {

        minIntStream(arr);

    }



    private int minIntStream(int[] arr) {

        return Arrays.stream(arr).min().getAsInt();

    }



    private int minIntParallelStream(int[] arr) {

        return Arrays.stream(arr).parallel().min().getAsInt();

    }



    private int minIntFor(int[] arr) {

        int min = Integer.MAX_VALUE;

        for (int anArr : arr) {

            if (anArr < min) {

                min = anArr;

            }

        }

        return min;

    }



    private static void randomInt(int[] arr) {

        Random r = new Random();

        for (int i = 0; i < arr.length; i++) {

            arr[i] = r.nextInt();

        }

    }

}

测试用例二:


import com.github.houbb.junitperf.core.annotation.JunitPerfConfig;

import com.github.houbb.junitperf.core.report.impl.HtmlReporter;

import org.junit.jupiter.api.BeforeAll;



import java.util.ArrayList;

import java.util.Random;



public class StreamStringTest {



    public static ArrayList<String> list;



    @BeforeAll

    public static void init() {

        list = randomStringList(1000000);

    }



    @JunitPerfConfig(duration = 10000, warmUp = 1000, reporter = {HtmlReporter.class})

    public void testMinStringForLoop(){

        String minStr = null;

        boolean first = true;

        for(String str : list){

            if(first){

                first = false;

                minStr = str;

            }

            if(minStr.compareTo(str)>0){

                minStr = str;

            }

        }

    }



    @JunitPerfConfig(duration = 10000, warmUp = 1000, reporter = {HtmlReporter.class})

    public void textMinStringStream(){

        list.stream().min(String::compareTo).get();

    }



    @JunitPerfConfig(duration = 10000, warmUp = 1000, reporter = {HtmlReporter.class})

    public void testMinStringParallelStream(){

        list.stream().parallel().min(String::compareTo).get();

    }



    private static ArrayList<String> randomStringList(int listLength){

        ArrayList<String> list = new ArrayList<>(listLength);

        Random rand = new Random();

        int strLength = 10;

        StringBuilder buf = new StringBuilder(strLength);

        for(int i=0; i<listLength; i++){

            buf.delete(0, buf.length());

            for(int j=0; j<strLength; j++){

                buf.append((char)('a'+ rand.nextInt(26)));

            }

            list.add(buf.toString());

        }

        return list;

    }

}

测试用例三:


import com.github.houbb.junitperf.core.annotation.JunitPerfConfig;

import com.github.houbb.junitperf.core.report.impl.HtmlReporter;

import org.junit.jupiter.api.BeforeAll;



import java.util.*;

import java.util.stream.Collectors;



public class StreamObjectTest {



    public static List<Order> orders;



    @BeforeAll

    public static void init() {

        orders = Order.genOrders(10);

    }



    @JunitPerfConfig(duration = 10000, warmUp = 1000, reporter = {HtmlReporter.class})

    public void testSumOrderForLoop(){

        Map<String, Double> map = new HashMap<>();

        for(Order od : orders){

            String userName = od.getUserName();

            Double v; 

            if((v=map.get(userName)) != null){

                map.put(userName, v+od.getPrice());

            }else{

                map.put(userName, od.getPrice());

            }

        }



    }



    @JunitPerfConfig(duration = 10000, warmUp = 1000, reporter = {HtmlReporter.class})

    public void testSumOrderStream(){

        orders.stream().collect(

                Collectors.groupingBy(Order::getUserName, 

                        Collectors.summingDouble(Order::getPrice)));

    }





# 技术学习总结

学习技术一定要制定一个明确的学习路线,这样才能高效的学习,不必要做无效功,既浪费时间又得不到什么效率,大家不妨按照我这份路线来学习。

![](https://img-blog.csdnimg.cn/img_convert/4e0696974708de678d08a66fdf94c139.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/675f5baba1cfbb31577a30b745f5dc37.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/bf83f8cc27bf3c1c5c145b8fd27aef49.webp?x-oss-process=image/format,png)

# 最后面试分享

大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!

![](https://img-blog.csdnimg.cn/img_convert/3136b59aa47f05b6e2fc12c932070e78.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/404d315f2ba0a7be49a2b821ac2acee7.webp?x-oss-process=image/format,png)

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

[外链图片转存中...(img-fxBxPzar-1715542153344)]

# 最后面试分享

大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!

[外链图片转存中...(img-Cftu0ejk-1715542153344)]

[外链图片转存中...(img-8g6YrXkm-1715542153345)]

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值