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

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

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

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

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

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

for循环

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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循环

同样数据量,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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

同样数据量,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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并行处理可能会效率更慢)

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

posted on   Java知音号  阅读(7428)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示