zoukankan      html  css  js  c++  java
  • for、foreach、stream 哪家的效率更高,你真的用对了吗?

    昨天在《SQL中那么多函数,Java8为什么还要提供重复的Stream方法,多此一举?》一文中,有同学指出Stream在数据量不庞大的情况,效率不如for循环。

    for、foreach、stream 哪家的效率更高,你真的用对了吗?

    这个就触及到我的知识盲区了,今天赶紧测试了一下,以下是正文,有问题欢迎大家指出,一起学习!

    for、foreach、stream 哪家的效率更高,你真的用对了吗?

    比较for循环、foreach循环及Stream方法效率

    for循环

    首先,10000数据的for循环,代码如下:

    public class ForTest {
    
        public static void main(String[] args) {
            Long startTime = System.currentTimeMillis();
            formMethod();
            Long endTime = System.currentTimeMillis();
            System.out.println("time_total:" + (endTime - startTime));
        }
    
        public static void formMethod(){
            for (int i = 0; i < 10000; i++) {
                System.out.println("__________for循环____________");
            }
        }
    }
    

      

    测试结果:

    for、foreach、stream 哪家的效率更高,你真的用对了吗?

    运行多次,时间基本落在100内,90左右。

    foreach循环

    同样数据量,代码如下:

    public class ForTest {
    
        public static void main(String[] args) {
            List<Integer> lists = new ArrayList<>();
            for (int i = 0; i < 10000; i++) {
                lists.add(i);
            }
            Long startTime = System.currentTimeMillis();
            formMethod(lists);
            Long endTime = System.currentTimeMillis();
            System.out.println("time_total:" + (endTime - startTime));
        }
    
        public static void formMethod(List<Integer> lists){
            lists.forEach(i->{
                System.out.println("__________forEach____________");
            });
        }
    }
    

      

    测试结果:

    for、foreach、stream 哪家的效率更高,你真的用对了吗?

    运行多次,时间基本落在150左右。额,这个增强型效果不如for循环~

    Stream

    同样数据量,代码如下:

    public class ForTest {
    
        public static void main(String[] args) {
            List<Integer> lists = new ArrayList<>();
            for (int i = 0; i < 10000; i++) {
                lists.add(i);
            }
            Long startTime = System.currentTimeMillis();
            formMethod(lists);
            Long endTime = System.currentTimeMillis();
            System.out.println("time_total:" + (endTime - startTime));
        }
    
        public static void formMethod(List<Integer> lists){
            lists.stream().forEach(i->{
                System.out.println("__________stream处理____________");
            });
        }
    }
    

      

    测试结果:

    for、foreach、stream 哪家的效率更高,你真的用对了吗?

    基本和增强型for循环效率差别不大。

    得出结论:

    1万以内的数据,for循环的性能要高于foreach和stream;

    昨天那位同学说的没毛病!!!

    数据加到1000万,代码不变,看结果:

    for循环

    for、foreach、stream 哪家的效率更高,你真的用对了吗?

    时间落在43240附近。

    foreach循环

    for、foreach、stream 哪家的效率更高,你真的用对了吗?

    基本和for循环效率差别不大。

    Stream

    for、foreach、stream 哪家的效率更高,你真的用对了吗?

    基本和for循环,增强型for循环效率差别不大。

    Stream的优势在于,提供了并行处理(parallelStream()方法),即stream api提供了异步处理机制,可以充分利用CPU核数,大大提升效率!因为机器配置原因,没有给出并行处理下的结果截图~~

    得出结论:

    数据量上去之后,测试三种遍历方式,基本已经没有什么差距了,但是Stream提供并行处理,在数据量大了之后,效率会明显增强。(但是单核CPU,Stream并行处理可能会效率更慢)

    下次用什么来做遍历操作,你清楚了吗?

    【Java知音】公众号,每天早上8:30为您准时推送一篇技术文章 在Java知音公众号内回复“面试题聚合”,送你一份Java面试题宝典。
  • 相关阅读:
    C# 生成windows 服务打包程序
    Ext.Net 复制GridPanel的数据
    The web.config file for this project is missing the required DirectRequestModule.
    微软 Remote App
    IIS 中的虚拟目录 和软连接
    C# 生成word 文档 代码 外加 IIS报错解决方案
    .NET:序列化和反序列化
    设计模式:常见设计模式适用的场景
    WebApi:自定义筛选器
    log4net:保存自定义参数到数据库
  • 原文地址:https://www.cnblogs.com/javazhiyin/p/14803842.html
Copyright © 2011-2022 走看看