详解lambda表达式foreach性能分析

 更新时间:2020年11月06日 10:27:08   作者:shaoyangdd  
这篇文章主要介绍了详解lambda表达式foreach性能分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

java 8的新特性之一就是lambda表达式,parallelStream()都说性能会比较高,现一探究竟。

话不多说,上代码:

 @Test
  public void test2(){

    List<String> list = new ArrayList<>();
    for(int i=0;i<10000;i++)
      list.add(String.valueOf(i));
    //lambda表达式
    long start = System.currentTimeMillis();
//    list.parallelStream().forEach((s)->{
//      s.toString();
//    });
    //普通测试
    for (Object s :list){
      s.toString();
    }
    long end = System.currentTimeMillis();
    System.out.println("耗时:"+(end-start) +" ms");
  }

测试结果如下:

   

普通fo循环耗时3ms。           

为何lambda表达式的性能比普通的还差,我猜测是因为:list.parallelStream()是并发处理的,大量的线程上下文切换导致性能下降。如何证明?那就把for循环里的处理时间设置长一点吧,设置成如下代码:

  public void test1(){

    List<String> list = new ArrayList<>();
    for(int i=0;i<10000;i++)
      list.add(String.valueOf(i));
    //lambda表达式
    long start = System.currentTimeMillis();
//    list.parallelStream().forEach((s)->{
//      try {
//        Thread.sleep(4);
//      } catch (InterruptedException e) {
//        e.printStackTrace();
//      }
//    });
    //普通测试
		for (Object s :list){
			try {
				Thread.sleep(4);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			s.toString();
		}
    long end = System.currentTimeMillis();
    System.out.println("耗时:"+(end-start) +" ms");
  }

测试结果:

普通耗时:13454ms

 lambda表达式耗时3314秒。

果然如老夫所料。

再次验证list.parallelStream()是多线程执行, 用visualVM工具看运行时的线程情况,如下:

 普通for循环只有主线程在处理。

lambda表达式的启了三个worker线程处理。

再一次验证了我的想法。

所以结论是:对于耗时的操作用lambda表达式的for循环,如数据库的IO操作,多线程充分利用CPU资源;对于不太耗时的操作使用普通for循环,比如纯CPU计算类型的操作,单线程性能更高,减少上下文切换的开销。

到此这篇关于详解lambda表达式foreach性能分析的文章就介绍到这了,更多相关lambda表达式foreach性能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅析Java线程的中断机制

    浅析Java线程的中断机制

    本篇文章通过代码实例给大家分享了学习Java线程的中断机制的一些心得内容,有兴趣的朋友学习下吧。
    2017-12-12
  • Java中支持可变参数详解

    Java中支持可变参数详解

    那个可变参数的就是个数组,你传多少个参数都被放到那个数组里面。这样方便了程序员,因为如果不确定要传的参数的个数的话,我们要写带1个参数的,带2个参数,带3个参数的,这样很麻烦。 该进后的这个方法,我们只要写一个函数就好,可以传任意个参数。
    2015-05-05
  • Java基础知识精选 你答对了几道?

    Java基础知识精选 你答对了几道?

    精选Java基础知识讲解,看看你能答对多少?
    2017-09-09
  • 解读Spring Bean的作用域

    解读Spring Bean的作用域

    这篇文章主要介绍了解读Spring Bean的作用域,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Java调用阿里身份证实现验证接口

    Java调用阿里身份证实现验证接口

    这篇文章主要为大家详细介绍了Java如何调用阿里身份证实现验证接口,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-06-06
  • SpringBoot整合阿里云OSS对象存储服务实现文件上传

    SpringBoot整合阿里云OSS对象存储服务实现文件上传

    这篇文章主要介绍了SpringBoot整合阿里云OSS对象存储实现文件上传,帮助大家更好的理解和学习使用SpringBoot,感兴趣的朋友可以了解下
    2021-04-04
  • SpringBoot整合FastDFS方法过程详解

    SpringBoot整合FastDFS方法过程详解

    这篇文章主要介绍了SpringBoot整合FastDFS方法过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • java正则表达式如何获取xml文件中指定节点的值

    java正则表达式如何获取xml文件中指定节点的值

    这篇文章主要介绍了java正则表达式如何获取xml文件中指定节点的值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • SpringMVC数据输出相关知识总结

    SpringMVC数据输出相关知识总结

    今天带大家学习SpringMVC的相关知识,文中对SpringMVC数据输出作了非常详细的代码示例,对正在学习的小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06
  • SpringBoot集成QQ第三方登陆的实现

    SpringBoot集成QQ第三方登陆的实现

    这篇文章主要介绍了SpringBoot集成QQ第三方登陆的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论