Java 8中新的并行API:Glitz和Glamour的背后

Blog_socks03

我是一个出色的多任务处理者。 即使我在写这篇文章,我仍然可以为昨天在一个大家都对我陌生的聚会上发表的言论感到尴尬。 好消息是,我并不孤单– Java 8在多任务处理方面也相当出色。 让我们看看如何。

Java 8中引入的关键新功能之一是并行数组操作。 这包括使用自动利用多核体系结构的Lambda表达式对项目进行排序,过滤和分组的功能。 作为Java开发人员,这里的承诺是在我们付出最小努力的情况下立即获得性能提升。 很酷

因此,问题就变成了:这东西有多快?何时使用? 好吧,快速的答案令人遗憾- 这取决于 。 想知道什么? 继续阅读。

新的API

新的Java 8并行操作API非常漂亮。 让我们看一下我们将要测试的一些。

    1. 要使用多个核对数组进行排序 ,您要做的就是–
      Arrays.parallelSort(numbers);
    2. A 收集到不同的组基于特定标准(如黄金和非素数) -
      Map<Boolean, List<Integer>> groupByPrimary = numbers.parallelStream().collect(Collectors.groupingBy(s -> Utility.isPrime(s)));
    3. 过滤掉值,您要做的就是–
      Integer[]  prims = numbers.parallelStream().filter(s -> Utility.isPrime(s)).toArray();

将此与自己编写多线程实现进行比较。 大大提高了生产力! 我个人对这种新体系结构喜欢的东西是Spliterators的新概念,用于将目标集合拆分为多个块,然后可以并行处理这些块并缝合回去。 就像他们的老兄迭代器用于遍历项目集合一样,这是一种灵活的体系结构,使您可以编写自定义行为来遍历和拆分可以直接插入的集合。

那么它的表现如何呢?

为了验证这一点,我检查了并行操作在两种情况下( 低和高竞争情况)如何工作。 原因是本身运行多核算法通常会产生不错的结果。 当踢脚程序开始在实际服务器环境中运行时,它就会进入。 那就是大量池线程不断争夺宝贵的CPU周期来处理消息或用户请求的地方。 这就是事情开始放缓的地方。 为此,我设置了以下测试 。 我将100K个整数的数组随机化,其值范围在零到一百万之间。 然后,我使用传统的顺序方法和新的Java 8并行API对它们进行排序,分组和过滤操作。 结果并不令人惊讶。

    • Quicksort现在快了4.7倍。
    • 分组现在快5倍倍。
    • 现在, 过滤速度提高了5.5倍。

    一个快乐的结局? 不幸的是没有

    表2

    *结果与运行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

      本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364161.shtml

      如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

      相关文章

      有趣的js匿名函数写法(function嵌套)

      例子没有什么实际意义&#xff0c;只能做为思路参考 <!DOCTYPE html><html><head><meta charset"UTF-8"><title></title></head><body><script>function ck(a) {console.log(a);return function(b) {console.…

      mangouDB和mysql的区别_谈谈mongodb,mysql的区别和具体应用场景

      最近对数据库比较感兴趣&#xff0c;于是就去研究了下部分相关热门的数据库。MySQL关系型数据库。在不同的引擎上有不同 的存储方式。查询语句是使用传统的sql语句&#xff0c;拥有较为成熟的体系&#xff0c;成熟度很高。开源数据库的份额在不断增加&#xff0c;mysql的份额页…

      ASP.NET 中执行 URL 重写

      作者&#xff1a;overred 来源&#xff1a;原创URL 重写就是把URL地址重新改写&#xff08;汗^_^&#xff09;。详情&#xff1a;http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx优点&#xff1a;把url缩短等用法&#xff1a;1.下载ms的…

      考眼力

      题目内容&#xff1a; gmbh{4d850d5c3c2756f67b91cbe8f046eebd} try to find the flag 看到gmbh发现偏移&#xff0c;按照gmbhflag发现字母向左发生偏移&#xff0c;字母全部向左移动一位即可得到flag。 flag&#xff1a;flag{4c850c5b3b2756e67a91bad8e046ddac} 总结&#xf…

      springMVC开启声明式事务实现操作日志记录

      第一步、在applicationContext-mvc.xml开启AOP注解扫描 <aop:aspectj-autoproxy/> 第二步、创建增强类&#xff0c;实现日志记录 Component //把切面添加到spring容器中 Aspect //变成切面类 public class WriteLog {/***参数&#xff1a;代表目标方法对象**/public Obje…

      Spring Boot 1.0和Spring Boot 1.0.1错误修复版本

      Spring Boot团队最近宣布了Spring Boot 1.0版本 &#xff0c;随后是Spring Boot 1.0.1.RELEASE &#xff0c;这是一个错误修复版本&#xff0c;其中还包含一些新功能。 Spring Boot创建于18个月前&#xff0c;旨在改善无容器Web应用程序体系结构。 新版本已经在Maven Central和…

      nine

      nine Scarpy爬虫框架https://www.cnblogs.com/kermitjam/articles/10147261.html?tdsourcetags_pctim_aiomsg 高并发的爬虫框架 Runspider只能执行某个 爬虫程序.py文件 将项目根目录导入 Xpath语法 获取内容&#xff08;‘./text()’) 发送请求 ---> 获取响应数据 --->…

      mysql用户 11_MySQL-快速入门(11)用户管理

      1、权限表存储用户权限信息表主要有&#xff1a;user、db、host、tables_priv、columns_priv、procs_priv。1》user表&#xff1a;记录允许连接到服务器的账号信息&#xff0c;里面的权限是全局级别的。user表有42个字段&#xff0c;这些字段可以分为4类&#xff0c;分别是用户…

      利用canvas来绘制一个会动的图画

      1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <title>绘制小人动画</title>6 <style>7 canvas{8 border: 1px solid green;9 }10 </s…

      flash快捷键

      < DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> A 箭头L 套索 N 直线T 文字 O 椭圆R 矩形 P 铅笔B 笔刷 I 墨水瓶U 油漆桶 D 滴管E 橡皮擦 H 移动M 放大镜 CTRLN 新建一个影片 CTRLO 打开一个影片 CTRLSHIFTO 以图库打开影片 CT…

      求逆序数——树状数组

      简介 首先解释一下什么是逆序数&#xff0c;在一个排列中&#xff0c;如果前面的数大于后面的数&#xff0c;则称这两个数为一对逆序&#xff0c;而在这个排列中逆序对的总数称为逆序数。 然后对于树状数组&#xff0c;如果有一点了解的话&#xff0c;树状数组一般是用于数组区…

      数据库范式设计

      设计范式(第一范式&#xff0c;第二范式&#xff0c;第三范式)所谓第一范式&#xff08;1NF&#xff09;是指数据库表的每一列都是不可分割的基本数据项&#xff0c;同一列中不能有多个值&#xff0c;即实体中的某个属性不能有多个值或者不能有重复的属性。 create table stude…

      使用ActiveMQ –具有故障转移协议的“主/从”配置

      介绍 ActiveMQ代理往往是企业中消息传递基础结构的核心部分。 此消息传递基础结构的高度可用性和可伸缩性至关重要。 请阅读此链接 &#xff0c;以了解有关创建经纪人网络以支持各种用例的更多信息。 ActiveMQ的流行用例之一是带有共享数据库的主/从配置。 使用此配置时&#x…

      npm dev run 报错

      解决办法&#xff1a; npm run dev --port 8088 Error: listen EACCES 0.0.0.0:8080at Object.exports._errnoException (util.js:1026:11) at exports._exceptionWithHostPort (util.js:1049:20) at Server._listen2 (net.js:1244:19) at listen (net.js:1293:10) at Server.…

      页面那些位置是投放广告的最佳位置

      通常好的广告位置并非页面最上方的通栏广告&#xff0c;而是页面第一屏导航条下面中央和左侧的位置&#xff0c;此处放置广告会取得较好的效果。除此之外&#xff0c;页面中屏主要内容附件的位置为左侧和下侧较好&#xff0c;用户会第一时间注意到并关注这些广告。 转载于:http…

      选择结构

      运算符优先级&#xff08; &#xff09; → 单目( -- !) → 算术 → 关系 → 逻辑 → 条件 → 赋值 短路 现象&#xff08;扩展&#xff09;当 true 遇到 || &#xff0c;也就是 true || &#xff0c; || 右侧的表达式不执行 当 false 遇到 && ,…

      ##API(二)————包装类

      包装类 ##一、Java语音是面向对象的&#xff0c;但是Java中的基本数据类型却不是面向对象的&#xff0c;在实际开发中存在很多的不便&#xff0c;为了解决这个不足&#xff0c;在设计类时为每个数据类型设计一个相应的类&#xff0c;成为包装类。 ##二、包装类位于Java.lang包中…

      如何在Java中将字节数组转换为InputStream和OutputStream

      您是否坚持使用编码&#xff0c;因为您有字节数组&#xff0c;并且链中的下一个方法需要InputStream&#xff1f; 不用担心Java有解决方案&#xff0c;您可以使用 ByteArrayInputStream 在Java中将字节数组转换为InputStream 。 此类使用字节数组作为源&#xff0c;并且由于它…

      python 选择多个文件夹_如何同时选择多个文件?

      登录百度网盘后&#xff0c;我想一次选定2个文件方法1&#xff1a;path1 driver.find_element_by_xpath(//a[title"test1"])ActionChains(driver).move_to_element(path1).perform()ActionChains(driver).context_click(path1).perform()path2 driver.find_element…

      5.jQueryAjax

      1.jQuery 什么是 jQuery &#xff1f; jQuery是一个JavaScript函数库。jQuery是一个轻量级的"写的少&#xff0c;做的多"的JavaScript库。包含以下功能&#xff1a; HTML 元素选取HTML 元素操作CSS 操作HTML 事件函数JavaScript 特效和动画HTML DOM 遍历和修改AJA…