JDK1.8的foreach循环效率不如for循环,它为什么还要出现???

文天大人 2016-05-04 06:14:23
各位大神好,小弟今天测试了一下JDK8中的foreach和传统的泛型foreach循环,本以为他俩会差不多,结果是JDK8的foreach远远不如以前的泛型foreach循环,那么它为什么还要出现??测试代码很简单
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
for(int i=0;i<100000;i++){
list.add("a");
}
long a=System.currentTimeMillis();
for(String action:list){
if(action==null){
//什么都不干,就判断一下而已
}
}
long b=System.currentTimeMillis();
System.out.println(b-a);//传统的foreach时间1
list.forEach(action->{
if(action==null){
//什么都不干,就判断一下而已
};
});

long c=System.currentTimeMillis();
System.out.println(c-b);//JDK8的时间2
}
控制台打印的时间,JDK8耗时是传统foreach的好几十倍,求大神解释
...全文
9114 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dkodak 2020-04-30
  • 打赏
  • 举报
回复
数据量的大小会影响到循环的适应
LewisLS 2020-04-30
  • 打赏
  • 举报
回复
不能这么看的,这两段代码底层实现一模一样,不是JDK8耗时是传统foreach的好几十倍,而是多100ms而已 你集合再大一点,耗时也是多100ms
微暖丶温情 2020-03-24
  • 打赏
  • 举报
回复
假如你的类中,需要多次for循环,java8 forEach 会比增强for循环,性能高,因为其设计需要预热
qq_34287771 2019-05-27
  • 打赏
  • 举报
回复
1万数据量 foreach 慢6ms 5万数据 foreach 快3ms 10万数据 foreach快32ms 100万数据 foreach快93ms
SarielAngel 2018-11-09
  • 打赏
  • 举报
回复
引用 9 楼 SarielAngel 的回复:
你试验一下在循环里面做点事。
比如sleep(100);
你就会发现,lamda的foreach是多线程处理的。
虽然启动上确实慢了很多(毕竟跑线程池),但并发处理会让整体结果速度提升。
尤其在循环调用远程接口,或者循环访问数据库的时候会有特别明显的提升。


提示一点,不是list.forEach()
而是list.parallelStream().forEach()

如果是list.forEach(),效率没什么影响,就是换个写法而已。
SarielAngel 2018-11-09
  • 打赏
  • 举报
回复
你试验一下在循环里面做点事。
比如sleep(100);
你就会发现,lamda的foreach是多线程处理的。
虽然启动上确实慢了很多(毕竟跑线程池),但并发处理会让整体结果速度提升。
尤其在循环调用远程接口,或者循环访问数据库的时候会有特别明显的提升。
zhuhuizhan 2018-06-23
  • 打赏
  • 举报
回复 1
lambda使代码简洁,与stream搭配使用,能充分利用多核,实现真正的并行,如果数据量不大,只能起到简化代码的作用,性能方面并没有太突出的优势,甚至会比for循环差,因为程序第一次使用lamda的时候需要初始化一些lambda框架的东西,这些也要花费时间,而for循环就不需要这些时间开销,上来就能执行。当迭代的数据量大的时候,lambda性能优势就体现出来了
matthew_leung 2018-06-22
  • 打赏
  • 举报
回复
foreach是为了优化编程人员编写代码的效率,而不是为了代码的运行效率。
一种编程语言不仅仅要考虑代码的运行效率,还要综合考虑各种因素,例如代码编写效率。
就好比现在大行其道的是python,它的运行效率更是低得令人发指,但是它优秀的编写效率还有入门简易性还是在不断的提高他的人气
如果你喜欢单纯高性能的代码。
那么汇编和C语言是最快的吧,c++应该能如你所愿了
QuietSugar 2018-06-22
  • 打赏
  • 举报
回复
这里有解释https://blog.csdn.net/u_ascend/article/details/80777033
HinanaiTenshi 2017-05-27
  • 打赏
  • 举报
回复
没记错的话,jdk8的朗母达表达式性能是不如传统书写方式的。 至于为何要出现的问题,jdk的api和语法又不是维了效率做极致优化的。 从理论上来说面向对象的编程,性能相对面向过程肯定是降低的,但是可维护性或清晰度有了很大的提升。 所以一个特性用于不用,取决于你关注什么,当公司给你半年时间去做功能实现的时候,显然不会有人花3个月去做性能优化,这时候更清晰合理的代码就很重要了,大多数时候性能问题不是来自于算法和api表现平庸,而是出自各种系统bug。
  • 打赏
  • 举报
回复
试着 讲你的测试数据 扩大三个数量级呢
nikyotensai 2016-10-21
  • 打赏
  • 举报
回复
forEach和foreach
神奇小宝 2016-10-21
  • 打赏
  • 举报
回复
引用 1 楼 can8888 的回复:
ArrayList不推荐使用foreach,数组和 其它集合可以使用。这是我在《进击的Java》里面看到的。



抱歉看错了问题了。
神奇小宝 2016-10-21
  • 打赏
  • 举报
回复
ArrayList不推荐使用foreach,数组和 其它集合可以使用。这是我在《进击的Java》里面看到的。

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧