详解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性能内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Map 使用 Lambda 的 forEach 实现跳出循环操作

    Lambda 的 forEach表达式用起来很爽啊,最近开发中用来遍历了一下Map,结果就翻车了......大致场景如下: public static void main(String[] args) { HashMap<String,String> map = new HashMap<>(); map.put("1","001"); map.put("2","002"); map.put("

  • java8 forEach结合Lambda表达式遍历 List操作

    我就废话不多说了,大家还是直接看代码吧~ @Test void testJava8ForeachMap() { Map<String, Integer> items = new HashMap<>(); items.put("A", 10); items.put("B", 20); items.put("C", 30); items.put("D", 40); items.put("E&quo

  • 在lambda的foreach遍历中break退出操作(lambda foreach break)

    前言 Q: 当我们需要在lambda的遍历循环中返回或者退出,应该怎么办? A: 在lambda的foreach中是不能用break的,这相当不人性化.但是别忘了,用回默认的forEach遍历是可以的. >>>When using external iteration over an Iterable we use break or return from enhanced for-each loop as:\ //by zhengkai.blog.csdn.net for (SomeO

  • 详解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(); /

  • C++实例详解lambda表达式的使用

    目录 lambda表达式 1.lambda表达式语法 2.lambda应用 3.lambda表达式的应用实践 1.计算器案例 2.智能指针案例 3.优先级队列 lambda表达式 C++11 函数对象的升级版 => lambda表达式 函数对象的缺点:(需要定义一个类) 函数对象使用在 泛型算法参数传递 比较性质/自定义操作 优先级队列 智能指针(自定义智能指针的删除器) lambda表达式原理: 就是函数对象更高级的实现! 1.lambda表达式语法 例1: lambda表达式对应函数对象小括

  • 详解Java8的forEach(...)如何提供index值

    Java2遍历集合 遍历Collection的代码,可以是采用Iterator接口,通过next()遍历.如: List<String> list = Arrays.asList("Hi", "I", "am", "Henry.Yao"); // 此处已经用到了泛型,不能算是纯粹的Java2代码,仅作Iterator示范 for (Iterator<String> it = list.iterator(

  • 详解Kotlin:forEach也能break和continue

    详解Kotlin:forEach也能break和continue 这样的问题.也就是说,他们想用forEach而不是for循环,因为这很fp,很洋气(我也喜欢), 但是他们又想使用break和continue,也就是普通的流程控制语句中的控制语句. 这很不fp,因为原本有filter是用于完成这个工作的,还有flapMap.BennyHuo在他发的文章里面也说的是这种方法. filter很fp,但是会导致两次遍历,这样的话给人一股效率很低的赶脚.而Java8的Stream API就只会遍历一次,

  • 详解Jackson 使用以及性能介绍

    直接上代码,看下最简单也是最常用的方法,将Object 转为 JSON 以及将Json转为Object方式 public class TestJackson { public static void main(String[] args) throws IOException { ObjectMapper objectMapper = new ObjectMapper(); Map<String,Object> params = new HashMap<>(); params.pu

  • 详解GaussDB for MySQL性能优化

    背景 我们先来看看MySQL 8.0的事务提交的大致流程 以上流程,是MySQL8.0对WAL原则的一种实现,这个流程意味着,任何一个事务的提交,一定要完成write buffer和flush to disk流程. 然而那么这个流程中,有一个问题:每个服务器的CPU是有限的,服务器能处理的Thread也是有上限的,那么当我们的业务的并发数量,远远大于我们服务器能并行处理的数量时,那么后来的事务,只能等待前面的事务提交后才能被处理.在这之前,他们什么也做不了.因此,在大并发场景下,如何进一步提升线

  • vue.js 双层嵌套for遍历的方法详解, 类似php foreach()

    主要运用 template 标签,可相当于 php foreach() foreach(lists as $key){ //todo foreach($key.自定义字段 as k){ //todo } } <template v-for="key in lists" v-cloak> <tr> <td></td> <td ></td> <td ></td> <td ></

  • C语言详解判断相同树案例分析

    目录 一.题目描述 二.解题思路 题目难度:简单 一.题目描述 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. LeetCode链接:相同的树 二.解题思路 核心思路: 先比较两颗二叉树的根节点 如果「都为空」,则返回 true,说明两树相同. 如果「一个为空一个不为空」,说明这两颗树不相同,则返回 false. 如果「都不为空,但节点值不相同」,说明这两颗树不相同,则返回 false. 经过 1 和

  • 详解Python进行数据相关性分析的三种方式

    目录 相关性实现 NumPy 相关性计算 SciPy 相关性计算 Pandas 相关性计算 线性相关实现 线性回归:SciPy 实现 等级相关 排名:SciPy 实现 等级相关性:NumPy 和 SciPy 实现 等级相关性:Pandas 实现 相关性的可视化 带有回归线的 XY 图 相关矩阵的热图 matplotlib 相关矩阵的热图 seaborn 相关性实现 统计和数据科学通常关注数据集的两个或多个变量(或特征)之间的关系.数据集中的每个数据点都是一个观察值,特征是这些观察值的属性或属性.

  • 详解cron表达式

    Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: (1) Seconds Minutes Hours DayofMonth Month DayofWeek Year (2)Seconds Minutes Hours DayofMonth Month DayofWeek 一.结构 corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份 二.各字段的含义 字段 允许值 允许的特殊字符 秒(Secon

随机推荐