Java 8中新的并行API:Glitz和Glamour的背后
我是一个出色的多任务处理者。 即使我在写这篇文章,我仍然可以为昨天在一个大家都对我陌生的聚会上发表的言论感到尴尬。 好消息是,我并不孤单– Java 8在多任务处理方面也相当出色。 让我们看看如何。
Java 8中引入的关键新功能之一是并行数组操作。 这包括使用自动利用多核体系结构的Lambda表达式对项目进行排序,过滤和分组的功能。 作为Java开发人员,这里的承诺是在我们付出最小努力的情况下立即获得性能提升。 很酷
因此,问题就变成了:这东西有多快?何时使用? 好吧,快速的答案令人遗憾- 这取决于 。 想知道什么? 继续阅读。
新的API
新的Java 8并行操作API非常漂亮。 让我们看一下我们将要测试的一些。
- 要使用多个核对数组进行排序 ,您要做的就是–
Arrays.parallelSort(numbers);
- A 组收集到不同的组基于特定标准(如黄金和非素数) -
Map<Boolean, List<Integer>> groupByPrimary = numbers.parallelStream().collect(Collectors.groupingBy(s -> Utility.isPrime(s)));
- 要过滤掉值,您要做的就是–
Integer[] prims = numbers.parallelStream().filter(s -> Utility.isPrime(s)).toArray();
将此与自己编写多线程实现进行比较。 大大提高了生产力! 我个人对这种新体系结构喜欢的东西是Spliterators的新概念,用于将目标集合拆分为多个块,然后可以并行处理这些块并缝合回去。 就像他们的老兄迭代器用于遍历项目集合一样,这是一种灵活的体系结构,使您可以编写自定义行为来遍历和拆分可以直接插入的集合。
那么它的表现如何呢?
为了验证这一点,我检查了并行操作在两种情况下( 低和高竞争情况)如何工作。 原因是本身运行多核算法通常会产生不错的结果。 当踢脚程序开始在实际服务器环境中运行时,它就会进入。 那就是大量池线程不断争夺宝贵的CPU周期来处理消息或用户请求的地方。 这就是事情开始放缓的地方。 为此,我设置了以下测试 。 我将100K个整数的数组随机化,其值范围在零到一百万之间。 然后,我使用传统的顺序方法和新的Java 8并行API对它们进行排序,分组和过滤操作。 结果并不令人惊讶。
- Quicksort现在快了4.7倍。
- 分组现在快5倍倍。
- 现在, 过滤速度提高了5.5倍。
一个快乐的结局? 不幸的是没有 。
*结果与运行100次的其他测试一致。*测试机器为MBP i7四核。
那么在负载下会发生什么呢?
到目前为止,情况一直很糟糕,原因是在CPU周期的线程之间几乎没有争用。 这是一种理想的情况,但是不幸的是,在现实生活中这种情况很少发生。 为了模拟一个与您在现实环境中通常看到的场景更相像的场景,我设置了第二个测试。 该测试运行相同的算法集,但是这次在十个并发线程上执行它们,以模拟在服务器承受压力( 将其命名为Kermit! )时处理服务器执行的十个并发请求。 然后,将使用传统方法或新的Java 8 API依次处理每个请求。
结果
- 现在排序速度仅加快了20%, 下降了 23倍。
- 现在, 过滤速度仅提高了20%, 下降了25倍 。
- 现在, 分组 速度降低了15% 。
较高的规模和竞争水平很可能会使这些数字进一步下降。 原因是在已经是多线程环境的环境中添加线程对您没有帮助。 我们只有多少个CPU,而不是线程。
结论
尽管这些都是非常强大且易于使用的API,但它们并不是灵丹妙药。 我们仍然需要对何时使用它们做出判断。 如果事先知道您将并行执行多个处理操作,那么考虑使用排队体系结构将并行操作的数量与您可用的实际处理器数量相匹配可能是个好主意。 这里最困难的部分是运行时性能将取决于实际的硬件体系结构和压力级别。 您的代码很可能只会在负载测试或生产过程中看到这些代码,这使这种经典情况“易于编码,难以调试”。
翻译自: https://www.javacodegeeks.com/2014/04/new-parallelism-apis-in-java-8-behind-the-glitz-and-glamour.html
Java 8中新的并行API:Glitz和Glamour的背后相关推荐
- java反射api研究_深入研究Java 8中的可选类API
java反射api研究 作为Java程序员,我们所有人都经历了以下情况:我们调用一个方法来获取某个值,然后代替直接对返回值调用某些方法,我们首先必须检查返回值是否不为null,然后在返回值. 这是像G ...
- 深入了解Java 8中的可选类API
作为Java程序员,我们所有人都经历了以下情况:我们调用一个方法来获取某个值,然后代替直接对返回值调用某些方法,我们首先必须检查返回值不为null,然后在返回值. 这是像Guava这样的外部API试图 ...
- Java SE 6 新特性: 编译器 API
新 API 功能简介 JDK 6 提供了在运行时调用编译器的 API,后面我们将假设把此 API 应用在 JSP 技术中.在传统的 JSP 技术中,服务器处理 JSP 通常需要进行下面 6 个步骤: ...
- java - 详解 Java 17 中新推出的密封类
Java 17推出的新特性Sealed Classes经历了2个Preview版本(JDK 15中的JEP 360.JDK 16中的JEP 397),最终定稿于JDK 17中的JEP 409.Seal ...
- 详解 Java 17 中新推出的密封类
Java 17推出的新特性Sealed Classes经历了2个Preview版本(JDK 15中的JEP 360.JDK 16中的JEP 397),最终定稿于JDK 17中的JEP 409.Seal ...
- Java SE 8新功能介绍:使用新的DateTime API计算时间跨度
使用Java SE 8新的DateTime API JSR 310-可以实现更清晰,可读且功能强大的编码. Java SE 8,JSR 310 在上一篇文章" 使用Streams API处理 ...
- 从Java 11中删除的API
在看到一些Java 10中删除了API之后, Java 11 ( JSR 384 )看起来将删除更多API. 在最近的OpenJDK java-se-spec-experts邮件列表帖子" ...
- Java 8的新特性—终极版
前言: Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.在Java Code Geeks上已经有很多介绍Java 8新特性的文章,例如Playing with Java ...
- Java 8的新特性
Java 8的新特性 前言: Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.在Java Code Geeks上已经有很多介绍Java 8新特性的文章,例如Playing ...
最新文章
- 使用自己的数据集训练MobileNet、ResNet实现图像分类(TensorFlow)| CSDN博文精选
- rand和srand
- Handler消息传递机制(二)Handler,Loop,Message,MessageQueue的工作原理
- 没有足够的权限删除OU
- 退出python交互模式_python如何退出交互模式
- html 表格_UiPath之发送正文包含表格的邮件(通过Html实现表格)
- Visual Studio中使用Git Flow
- java符号%3e%3e是什么意思,终于找到了!有了它你就可以读懂字节码了!
- (王道408考研操作系统)第三章内存管理-第一节6-3:非连续分配管理方式之基本分页存储管理之具有快表的地址变换机构
- hashmap containsvalue时间复杂度_Java-HashMap面试问答
- 反射工厂在数据访问层的应用
- python hash表
- 作业8 单元测试练习
- Mac安装iproute2/dig/traceroute
- iOS安全攻防(十三):数据擦除
- tp6 实现汉字转拼音
- 弹幕有硬伤,转变主流成妄想
- 微信小程序 腾讯地图大头针定位,获取当前地址,地图移动选点,定位当前位置
- mac mini u盘安装系统_系统安装丨如何制作U盘启动盘?
- PaddleOCR+OpenCV实现中英文识别
热门文章
- 计算机在轻化工程中的应用,计算机在轻化工程专业中的应用-中国大学mooc-题库零氪...
- 微型计算机中被处理信息称为,2011海南省计算机等级考试试题 二级C试题考资料...
- redis集群搭建报错-(error) CLUSTERDOWN The cluster is down
- jvm内存收集器总结(图片)
- java JNI调用C语言动态链接库(java.lang.UnsatisfiedLinkError: no yourClassName in java.library.path 异常的解决方法)
- 夜神模拟器模拟安卓测试_使用模拟进行测试
- aws lambda使用_使用AWS Lambda的CloudWatch事件通知
- java gc cms_Java垃圾收集器:G1GC何时将CMS强制退出?
- 垃圾收集 java_Java的内置垃圾收集如何使您的生活更美好(大部分时间)
- aws lambda_带有API网关的AWS Lambda