验证Collectors.groupingByConcurrent和 Collectors.groupingBy效率问题 (并行流 串行流) 我会带着你远行 2021-10-09 08:52 438阅读 0赞 一、定义实体类(数据载体) @Data public static class Stu { private Integer userId; private String fromClassId; } 二、定义main方法 public static void main(String[] args) { List<Stu> studentDTOS = Lists.newArrayList(); for (int i = 0; i < 20000; i++) { Stu studentDTO = new Stu(); studentDTO.setUserId(new Random().nextInt(20000) + 10); studentDTO.setFromClassId(String.valueOf(new Random().nextInt(2) + 10)); studentDTOS.add(studentDTO); } long l = System.currentTimeMillis(); Map<Integer, List<Stu>> map = studentDTOS.stream().collect(Collectors.groupingBy(Stu::getUserId)); System.out.println(System.currentTimeMillis() - l); l = System.currentTimeMillis(); ConcurrentMap<Integer, List<Stu>> map2 = studentDTOS.parallelStream().collect(Collectors.groupingByConcurrent(Stu::getUserId)); System.out.println(System.currentTimeMillis() - l); boolean result = mapCompar(studentDTOS, map, map2); System.out.println(); System.out.println(result); } private static boolean mapCompar(List<Stu> studentDTOS, Map<Integer, List<Stu>> hashMap, Map<Integer, List<Stu>> hashMap2) { boolean isChange = false; for (Map.Entry<Integer, List<Stu>> entry1 : hashMap.entrySet()) { List<Stu> m1value = entry1.getValue(); if (hashMap2.get(entry1.getKey()) == null) { break; } List<Stu> m2value = hashMap2.get(entry1.getKey()); if (!CollectionUtils.isEqualCollection(m1value, m2value)) { List<Stu> stus = studentDTOS.stream().filter(stu -> Objects.equal(entry1.getKey(), stu.getUserId())).collect(Collectors.toList()); System.out.println("key:" + entry1.getKey()); System.out.println("1:" + CollectionUtils.isEqualCollection(stus, m1value)); System.out.println("2:" + CollectionUtils.isEqualCollection(stus, m2value)); System.out.println(); System.out.println("样板数据:"); stus.forEach(s -> System.out.print(s.fromClassId + ",")); System.out.println(); System.out.println("m1数据:"); m1value.forEach(m1 -> System.out.print(m1.fromClassId + ",")); System.out.println(); System.out.println("m2数据:"); m2value.forEach(m2 -> System.out.print(m2.fromClassId + ",")); break; } isChange = true; } return isChange; } 代码我就不讲解实现思路了,有点基础的应该都可以看懂。 主要就是通过验证(假设有个N条数据,将其分为M个组。然后比较两种分组效率,并且验证两种分组的数据安全性问题) 三、上结论(图片中为两种方式耗时,单位:毫秒;前为串行流,后为并行流) 1.共200000000条数据 分为200000000个组 耗时比较:WC,半天没跑出来,建议不用再内存中分特大量数据。不建议使用 2.共2000000条数据 分为2000000个组 ![20200715103350418.png][] 3. 共2000000条数据 分为200个组 ![20200715103350464.png][] 4. 共200000条数据 分为200000个组 ![20200715103350455.png][] 5. 共200000条数据 分为20个组 ![20200715103350469.png][] 6. 共200条数据 分为200个组 ![20200715103350471.png][] 7. 共200条数据 分为20个组 ![20200715103350525.png][] 8. 共20条数据 分为2个组 ![20200715103350475.png][] ### 代码应该可以运行,有兴趣的同学可以试试自己跑一下,自己动手,可能更能理解。 ### [20200715103350418.png]: /images/20211009/199036a6025145cb986ca3ceb1f466f2.png [20200715103350464.png]: /images/20211009/8f2cd57e6a874ef882b7b3a24ad95326.png [20200715103350455.png]: /images/20211009/f59420b3133b4e97be0bcfc73a45e122.png [20200715103350469.png]: /images/20211009/afabdc6208fd467a92971731695146c0.png [20200715103350471.png]: /images/20211009/6aef2e9bc7fd48b382632f688f63b1f0.png [20200715103350525.png]: /images/20211009/63f6378f9b63418eb0eb5ba030b22a6b.png [20200715103350475.png]: /images/20211009/879a002725f84acc8700a949d298e942.png
相关 Java并行流:如何避免和解决并行一致性问题 在Java的并行流中,确实存在并行一致性的问题。这些问题主要来自于共享数据环境下的并发操作。 以下是一些避免和解决并行一致性问题的方法: 1. **使用`java.util 分手后的思念是犯贱/ 2024年09月11日 10:57/ 0 赞/ 12 阅读
相关 JDK8 | 串行流 Stream 与并行流 parallelStream -------------------- JDK8 | 串行流 Stream 与并行流 parallelStream -------------------- 一、 布满荆棘的人生/ 2023年02月22日 08:18/ 0 赞/ 15 阅读
相关 java8新特性--并行流与串行流 并行流与串行流 1、概述 2、实例 1、概述 并行流就是把一个内容分成多个数据块,并用不同的线程分 别处理每个数据块的流。 Java 8 中将并行 逃离我推掉我的手/ 2023年01月14日 13:57/ 0 赞/ 113 阅读
相关 【Java8新特性】关于并行流与串行流,你必须掌握这些!! 什么是并行流? 简单来说,并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。 Java 8 中将并行进行了优化,我们可以很容易的对数据进行并行操 骑猪看日落/ 2022年10月12日 01:05/ 0 赞/ 148 阅读
相关 Java 8 并行流 串行流 命令大全 1-容器生命周期管理 1.1-run 1.2-start/stop/restart 1.3-kill 骑猪看日落/ 2022年09月23日 11:56/ 0 赞/ 140 阅读
相关 并行流parallelStream 1.并发与并行的区别: 并发: 一个时间段内有几个程序都处于已启动到运行完毕之间,且这几个程序都是在同一个处理机上运行。但在任一个时刻点只有一个程序在处理机上运行 ╰+攻爆jí腚メ/ 2022年06月08日 02:24/ 0 赞/ 226 阅读
相关 并行流与串行流 Fork/Join框架 一、并行流概念: 并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。 java8中将并行进行了优化,我们可以很容易的对数据进行并行 秒速五厘米/ 2022年05月17日 02:59/ 0 赞/ 187 阅读
相关 jdk8的新特性总结(三):串行流与并行流 在上一篇文章中我们知道通过parallelStream方法可以获得一个并行流,那么什么是并行流呢?并行流就是把内容分割成多个数据块,每个数据块对应一个流,然后用多个线程分别处理 柔光的暖阳◎/ 2022年05月13日 12:10/ 0 赞/ 189 阅读
相关 验证Collectors.groupingByConcurrent和 Collectors.groupingBy效率问题 (并行流 串行流) 一、定义实体类(数据载体) @Data public static class Stu { private Integer u 我会带着你远行/ 2021年10月09日 08:52/ 0 赞/ 439 阅读
还没有评论,来说两句吧...