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,一经查实,立即删除!

      相关文章

      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的…

      nine

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

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

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

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

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

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

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

      mysql 笔记打包下载_mysql 5.7压缩包安装笔记

      重装系统之后准备安装mysql,看到官网上有mysql 5.7.10可以下载就点了,然后就开始了漫长的安装路程,总共折腾差不多一个多小时,最后终于安装成功了,这里把安装过程写下来,给自己做个笔记,也给后来人一个安装提示.1.下载安装包直接点击或者复制之后就可以下载了,不嫌麻烦或者想体…

      Java 8 LongAdders:管理并发计数器的正确方法

      我只是喜欢新玩具&#xff0c;而Java 8有很多 。 这次我想谈谈我的最爱之一-并发加法器。 这是一组用于管理由多个线程编写和读取的计数器的新类。 新的API有望显着提高性能&#xff0c;同时仍然使事情变得简单明了。 自从多核架构问世以来人们一直在管理并发计数器&#xff0…

      JS中ptototype和__proto__的关系

      学到原型的时候感觉头都大了/(ㄒoㄒ)/~~ 尤其是ptototype和__proto__ 傻傻分不清 通过多番查找资料&#xff0c;根据自己的理解&#xff0c;总结如下&#xff1a; 一、构造函数&#xff1a; 构造函数&#xff1a;通过new关键字可以用来创建特定类型的对象的函数。比如像Obje…

      [最短路]飞行

      题目描述 WFYZ的校园很大&#xff0c;这里生活着很多生物&#xff0c;比如住在钟楼上的的鸽子&#xff0c;其中鸽子冉冉和她的妹妹凝凝白天在不同的地方吃虫&#xff0c;而在晚上她们都回到钟楼休息。她俩是两只懒鸟&#xff0c;于是提出了一个计划&#xff0c;尽量减少她们在飞…

      Java状态和策略设计模式之间的差异

      为了在Core Java应用程序中正确使用状态和策略设计模式&#xff0c;对于Java开发人员清楚地了解它们之间的区别很重要。 尽管状态和策略设计模式的结构相似&#xff0c;并且都基于开放式封闭设计原则&#xff0c;从SOLID设计原则表示为“ O”&#xff0c;但它们在意图上完全不同…

      廖雪峰Java3异常处理-1错误处理-2捕获异常

      1捕获异常 1.1 finally语句保证有无错误都会执行 try{...}catch (){...}finally{...} 使用try...catch捕获异常可能发生异常的语句放在try{...}中使用catch捕获对应的Exception及其子类1.2 捕获多个异常 try{...} catch() {...} catch(){...}finally{..} 使用多个catch子句&…

      更新数据库

      方法一&#xff1a;在对SQL数据库进行更新时&#xff0c;用CommandBuilder对像来自动构建sql命令&#xff0c;来起到更新的作用;这种方法用起来比较方便&#xff0c;具体代码如下&#xff1a; 以下代码都在xp系统下测试通过 环境&#xff1a;vs.net2005 \ sql server 2000\xpus…

      在崩溃或断电后测试Lucene的索引耐久性

      Lucene有用的事务功能之一是索引持久性 &#xff0c;它可以确保一旦成功调用IndexWriter.commit &#xff0c;即使操作系统或JVM崩溃或断电&#xff0c;或者您杀死-KILL JVM进程&#xff0c;重启后索引也将保持完整&#xff08;未损坏&#xff09;&#xff0c;并将反映崩溃前的…

      Jmeter、postman、python 三大主流技术如何操作数据库?

      1、前言 只要是做测试工作的&#xff0c;必然会接触到数据库&#xff0c;数据库在工作中的主要应用场景包括但不限于以下&#xff1a; 功能测试中&#xff0c;涉及数据展示功能&#xff0c;需查库校验数据正确及完整性&#xff1b;例如商品搜索功能 自动化测试或性能测试中&a…

      利用ASP.NET向服务器上传文件[转]

      文件上传技术是一个很实用的技术&#xff0c;有着很广泛的应用&#xff0c;在ASP.NET自身的前一个版本ASP里实现这个功能&#xff0c;就必须使用第三方的组件或者自己开发组件了&#xff0c;现在&#xff0c;用ASP.NET实现起来就简单得多了&#xff0c;我们不需要使用任何组件就…

      java中HashMap详解

      HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员&#xff0c;其中 HashMap 是 Map 接口的常用实现类&#xff0c;HashSet 是 Set 接口的常用实现类。虽然 HashMap 和 HashSet 实现的接口规范不同&#xff0c;但它们底层的 Hash 存储机制完全一样&#xff0c;甚…

      java代码编写的文本特征提取_Test1 java语言写的特征提取源代码,有搞文字识别的可以下载一看,简单易学 Develop 274万源代码下载- www.pudn.com...

      文件名称: Test1下载 收藏√ [5 4 3 2 1 ]开发工具: Java文件大小: 35 KB上传时间: 2015-03-02下载次数: 46提 供 者: 常杰详细说明&#xff1a;java语言写的特征提取源代码&#xff0c;有搞文字识别的可以下载一看&#xff0c;简单易学-Feature extraction of the Java …

      c# HashTable (哈希表)

      HashTable 哈希表 也是System.Collections集合下的数据结构类 它储存的也是Object类型的对象 但是它在内存中是散列排布的 因为这个特性&#xff0c;非常适合存储大量的数据 在HashTable中一个键只能对应一个值&#xff0c;一个值可以对应多个键&#xff08;多对一&#xff09;…

      Spring集成–配置Web服务客户端超时

      介绍 在Spring Integration的支持下&#xff0c;您的应用程序可以使用出站Web服务网关来调用Web服务。 调用由该网关处理&#xff0c;因此您只需要担心构建请求消息和处理响应。 但是&#xff0c;使用这种方法并不明显&#xff0c;如何配置其他选项&#xff0c;例如设置超时或操…

      将txt文件和excel文件导入SQL2000数据库

      在做一些web数据库管理系统的时候经常要实现将帐户批量注册的功能&#xff0c;今天就来讲讲如何在C#-web项目中将txt文件和excel文件导入SQL2000数据库。1.数据库准备在SQL2000数据库的实例数据库pubs中建立一个数据表txtInsert&#xff0c;字段很简单&#xff1a;id&#xff0…