java中for和forEach的速度比较实例Demo
作者:吐泡泡的铁憨憨 发布时间:2022-06-20 07:09:58
标签:for,foreach,java
背景
之前和同事讨论一个问题,他们公司调研中发现forEach的速度比for的速度慢,当刚听到这个结论的时候有点诧异。因为之前看过国外的文章和他们公司的结论一样,但是测试用例单一。今天正好在看flink相关的流处理,正好想起来了这个问题,然后简单的写了一个demo来进行推翻这个结论。
废话不多说直接上代码吧
package pers.bik.flink;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.IntStream;
/**
* @author yangkaifei
* @date 2021/8/10 11:28 下午
* @cersion 1.0
*/
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
IntStream.range(0, 1000).forEach(number -> list.add(number));
streamForEach(list);
parallelStreamForEach(list);
forI(list);
strengthFor(list);
}
/**
* 串行流forEach
* @param list
*/
private static void streamForEach(List<Integer> list) {
AtomicInteger i = new AtomicInteger();
long startTime = System.currentTimeMillis();
list.stream().forEach(number -> {
String s = String.valueOf(number);
i.getAndIncrement();
});
long endTime = System.currentTimeMillis();
System.out.println(String.format("streamForEach:%s", endTime - startTime));
}
/**
* 并行流forEach
* @param list
*/
private static void parallelStreamForEach(List<Integer> list) {
AtomicInteger i = new AtomicInteger();
long startTime = System.currentTimeMillis();
list.parallelStream().forEach(number -> {
String s = String.valueOf(number);
i.getAndIncrement();
});
long endTime = System.currentTimeMillis();
System.out.println(String.format("parallelStreamForEach:%s", endTime - startTime));
}
/**
* for i
* @param list
*/
private static void forI(List<Integer> list) {
AtomicInteger i = new AtomicInteger();
long startTime = System.currentTimeMillis();
for (int j = 0; j < list.size(); j++) {
String s = String.valueOf(list.get(j));
i.getAndIncrement();
}
long endTime = System.currentTimeMillis();
System.out.println(String.format("forI:%s", endTime - startTime));
}
/**
* 增强for循环
* @param list
*/
private static void strengthFor(List<Integer> list) {
AtomicInteger i = new AtomicInteger();
long startTime = System.currentTimeMillis();
for (Integer integer : list) {
String s = String.valueOf(integer);
i.getAndIncrement();
}
long endTime = System.currentTimeMillis();
System.out.println(String.format("strengthFor:%s", endTime - startTime));
}
}
运行结果:
streamForEach:2041
parallelStreamForEach:352
forI:468
strengthFor:411
结论:
对于for、增强for循环、forEach不能单纯的抛开业务场景就去肯定的给出一个结论。forEach的速度未必就比for循环慢。
当我再次调整,将数量调整为1000的时候,运行的结果又会发生变化
IntStream.range(0, 1000).forEach(number -> list.add(number));
运行结果
streamForEach:1
parallelStreamForEach:4
forI:0
strengthFor:1
对比两个不同的数据量,运行的结果也不尽相同(当然代码有些不严谨,但是完全可以推翻forEach一定比for慢的结论,或者说A一定比B快的结论)。
在软件开发中,对于一切别人给定的结论我们要抱着质疑的态度,只有当自己亲身去调研的时候才能说服自己。
总结
来源:https://blog.csdn.net/qq_38275944/article/details/119582114


猜你喜欢
- 一、前言环境:jdk 1.8,SpringCloud Greenwich.SR2。如题,springcloud config-client启
- 一、this 关键字的使用1. 概述this是什么?在Java中,this关键字比较难理解,它的作用和其词义很接近,表示&ldquo
- 最近在开发关于java读取ftp中TXT文件,其中有些坑踩了一下,再次做个记录1、读取文件时我会根据文件名称去生成数据库表,oracle数据
- 本文实例为大家分享了Android实现时钟特效的具体代码,供大家参考,具体内容如下效果展示:功能介绍:如果您想换一张背景图,可以点击左下角按
- 在这一系列教程的最后一篇中,我想谈谈GR的EventBus,在处理多线程异步任务时是多么简单而有效。AsyncTask, Loader和Ex
- MyBatis插入Insert、InsertSelective的区别逆向自动生成的mybatis对应配置Mapper文件里面,有两个方法,分
- 前言通过本文你可以了解List的五种遍历方式及各自性能和foreach及Iterator的实现,加深对ArrayList和LinkedLis
- 前言一般生成的PDF文档默认的文档底色为白色,我们可以通过一定方法来更改文档的背景色,以达到文档美化以及保护双眼的作用。 以下内容提供了Ja
- 抛砖今天使用monio做S3存储时,添加云服务器初始化时一直在构建客户端抛出异常。MinioClient.builder() //NoCla
- 解决My eclipse 工程发布时端口占用问题如果运行后如图的错,需要进行如下操作来解决:a:打开cmd,输入netstat -ano 找
- 在很多场景中我们需要验证时间日期的是否属于正确的格式,验证时间是否符合常规的。1、验证 yyyy-MM-dd HH:mm:dd 格式的日期S
- 泛型将集合中的元素限定为一个特定的类型。术语ArrayList<E> -- 泛型类型ArrayList -- 原始类型E --
- 本文实例为大家分享了springMVC实现文件上传和下载的具体代码,供大家参考,具体内容如下1准备工作web.xml文件导入Dispatch
- 一、实验目的1. 掌握各种高级UI控件的基本使用;2. 能够实现Tab切换效果。二、实验任务1. 根据原型图设计界面;2. 实现Tab切换;
- 前言在Android中经常要使用Dialog来实现一些提示以及一些特殊的效果,而且样式也不一样,每次都得查一大堆资料,还不一定能解决。对话框
- 写在前面:上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业 * 的软考证书,然后接下
- public bool isUtf8(byte[] rawText)
- MVP(Model-View-Presenter) 是总所周知MVC模式的一个演变,他们的主要目的都是划分模块职责,降低模块耦合,易测试,提
- 本文实例为大家分享了android使用OPENGL ES绘制圆柱体的具体代码,供大家参考,具体内容如下效果图:编写jiem.java&nbs
- Redis 3.X版本引入了集群的新特性,为了保证所开发系统的高可用性项目组决定引用Redis的集群特性。对于Redis数据访问的支持,目前