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

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

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

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

比较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循环____________");
        }
    }
}

测试结果:

运行多次,时间基本落在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____________");
        });
    }
}

测试结果:

运行多次,时间基本落在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循环效率差别不大。

得出结论:

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

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

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

for循环

时间落在43240附近。

foreach循环

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

Stream

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

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

得出结论:

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

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

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。

相关文章
|
4月前
|
运维 供应链 监控
5 天学会阿里云 RPA:效率提升
在当今数字化时代,企业和组织越来越注重提高业务效率和降低运营成本。而阿里云 RPA(Robotic Process Automation,机器人流程自动化)的出现,为企业提供了一种全新的解决方案,帮助他们实现工作流程的自动化,大幅提升效率和准确性。
|
10月前
toArray指定的容量和效率关系
toArray指定的容量和效率关系
45 0
|
12月前
|
图形学
|
算法 搜索推荐 C语言
【八大排序(十)】八大排序效率与稳定性分析
【八大排序(十)】八大排序效率与稳定性分析
|
小程序
一个对提升效率有立竿见影效果的方法
这其实是上周末制定这周的计划时,额外增加的一条。因为我发现自己的工作效率与手机的解锁次数是成反比的,即在一天之内手机解锁的次数越多,那么这一天的工作效率就越差。请把这个规律结合到自己身上自查一下,对于大部分人来讲(除了有些必须通过手机开展工作业务的人)应该都是有效的。
65 0
(数据量大时通过map维护元素的信息来降低枚举复杂度AtCoder - abc233_d 与AtCoder - abc166_e
(数据量大时通过map维护元素的信息来降低枚举复杂度AtCoder - abc233_d 与AtCoder - abc166_e
56 0
|
SQL 关系型数据库 MySQL
京东一面:MySQL 中的 distinct 和 group by 哪个效率更高?问倒一大遍。。
京东一面:MySQL 中的 distinct 和 group by 哪个效率更高?问倒一大遍。。
117 0
|
SQL Java 大数据
Java性能优化:Stream如何提高遍历集合效率?
  通过上面两个简单的例子,我们可以发现,Stream结合Lambda表达式实现遍历筛选功能非常得简洁和便捷。
255 0
|
Java 索引
ArrayList哪种循环效率更好你真的清楚吗
ArrayList哪种循环效率更好你真的清楚吗
170 0