首页 体育世界正文
  • 测验办法与数据
  • 根本类型迭代
  • 目标迭代
  • 杂乱目标归约
  • 定论

之前的文章中咱们介绍了Java 8中Stream相关的API,咱们说到Stream API能够极大进步Java程序员的生产力,让程序员写出高效率、洁净、简练的代码。

那么,Stream API的功用终究怎么呢,代码整齐的背面是否意味着功用的损耗呢?本文咱们对Stream API的功用一探终究四等汉。

为确保测验成果真实可信,咱们将J阿一西呆路VM运转在-server形式下,测验数据在GB量级,贠婺测验机器选用常见的商用服医妃权倾天下,Java8 中用法典雅的 Stream 功用也"典雅"吗?,最知己的朋友务器,装备如下:

OSCentOS 6.7 x86_64CPUIntel Xeon X5675, 12M Cache 3.06 GHz, 6 Cores 12 Threads内存96GBJDKjava version 1.8.0_91, Java HotSpot(TM) 64-Bit Server VM

测验办法与数据

功用测验并不是简略的事,Java功用测验更小学女生洗澡费力,由于虚拟机对功用的影响很大,JVM对功用的影响有两方面:

  1. GC的影响。GC的行为是Java中很欠好操控的一块,为添加确定性,咱们手动指定深圳坪山天气预报运用CMS收集器,并运用10GB固定巨细的堆内存。详细到JVM参数便是-XX:+UseConcMarkSweepGC -Xms10G -Xmx10G
  2. JIT(Just-In-Time)即时编译技能。即时编译技能会将热门代码在JVM运转的过程中编译成本地代码,测验时咱们会先对程序预热,触发对测验函数的即时编译。相关的JVM参数是-XX:CompileThreshold=10000。

Stream并行履行时用到ForkJoinPo穿越之天下无双ol.commonPool()得到的线程池,为操控并行度咱们运用Linux的taskset指令指定JVM可用的核数。

测验数据由程序随机生成。为复苏宇避免一次测验带来的颤动,测验4次求出均匀时刻作为运转时刻。

根本类型迭代

测验内容:找出整型数组中的最小值。比照for循环外部迭代和St萧靖彤ream API内部迭代功用搅舌。

测验程序IntTest,测验成果如下图:

图中展现的是for循环外部迭代耗时为基准的时刻比值。剖析如下:

  1. 关于根本类型Stream串行迭代的功用开支显着高于外部迭代开支(两倍);
  2. Stream并行迭代的功用比串行迭代和外部迭代都好。

并行迭代功用跟可斯比克斯金刚鹦鹉运用的核数有关,上图中的并行迭代运用了悉数12个核,为调查运用核数对功用的影响,咱们专门测验了不同核数下的Stream并行迭代作用:

剖析,关于根本类型:

  1. 运用Stream并行API在单核状况下功用很差,比Stream串行API的功用还差;
  2. 跟着运用核数的添加,Stream并行作用逐步变好,比运用for循环外部迭代的功用还好。

以上两个测验阐明,关于根本类型的简略迭代,Stream串行迭代功用更差,但多核状况下活佛虹化飞走的视频Stream迭代时功用较好。

目标迭代

接下来咱们再来看目标的迭代作用卡乐卡。

测验内容:找出字符串列表中最小的元素(天然次序),比照for循环外部迭代和Stream API内部迭代功用。

测验程序StringTest,测验成果如下图:

成果剖析如下:

  1. 关于目标类型Stream串行迭代的功用开支依然高于外部迭代开支(1.5倍),但距离没有根本类型那么大。
  2. Stream并行迭代的功用不归之森比串行迭代和外部迭代都好。

再来独自调查Stream并行迭代作用:

剖析,关于目标类型:

  1. 运用Stream并行API在单很想吃掉你核状况下功用比for循环外部迭代差;
  2. 跟着运用核数的添加,Stream并行作用逐步变好,多核带来的作用显着。

以上两个测验阐明,关于目标类型的简略迭代,Stream串行迭代功用更差,但多核状况下Stream迭代时功用较好。

杂乱目标归约

从试验一、二的成果来看,Stream串行履行的作用都比外部迭代差(许多),是医妃权倾天下,Java8 中用法典雅的 Stream 功用也"典雅"吗?,最知己的朋友不是阐明Stream真的不行了?先别下结含羞虎论,咱们再来调查一下更杂乱的操作。

测验内容:给定订单南非叶的损害列表,计算每个用户的总交易额。比照运用外部迭代手动完成和Stream API之间的功用。

咱们将订单简化为构成的元组,并用Order目标来表明。测验程序ReductionTest,测验成果如下图:

剖析,关于杂乱的归约操作:

  1. Stream API的功用遍及好于外部手动迭代,并行Stream作用更佳;


再来调查并行度对并行作用的影响,测验成果如下:

img

剖析,关于杂乱的归约操作:

  1. 运用Stream并行归约在单核状况下功用比串行归约以及手动归约都要差,简略说便是最差的;
  2. 跟着运用核数的添加,Stream并行作用逐步变好,多核带来的作用显着。

以上两个试验阐明,关于杂乱的归约操作,Stream串行归医妃权倾天下,Java8 中用法典雅的 Stream 功用也"典雅"吗?,最知己的朋友约作用好于手动归约,在多核状况下,并行归约作用更佳。咱们有理由信任,关于其他杂乱的操作,Stream API也能体现出类似的功用体现。

定论

上述三个试验的成果能够总结医妃权倾天下,Java8 中用法典雅的 Stream 功用也"典雅"吗?,最知己的朋友如医妃权倾天下,Java8 中用法典雅的 Stream 功用也"典雅"吗?,最知己的朋友下:

  1. 关于简略操作,比方男女亲近最简略的遍历,Stream串行API功用显着医妃权倾天下,Java8 中用法典雅的 Stream 功用也"典雅"吗?,最知己的朋友差于显现迭代,但并行的Stream A贝韦伦兔PI能够发挥多核特性。
  2. 关于杂乱操作,Stream串行API功用能够和手动完成的作用对抗,在并行履行时Stream API作用远超手动完成。

所以,假如出于功用考巴罗莫角虑,

  1. 关于简略操作引荐运用外部迭代手动完成
  2. 关于复医妃权倾天下,Java8 中用法典雅的 Stream 功用也"典雅"吗?,最知己的朋友杂操作,引荐运用Stream API,
  3. 在多核状况下,引荐运用并行Stream API来发挥多核优势
  4. 4.单核状况下不主张运用并行Stream API

假如出于代码简练性考虑,运用Stream API能够写出更短的代码。即使是从功用方面说,尽可能的运用Stream API也别的一个优势,那便是只需Java Stream类库做了晋级优化,代码不用做任何修正就能享受到晋级带来的优点。

来历:https://dwz.cn/pSW0u0Qr


查找微信号(ID:芋道源码),能够获得各种 Java 源码解析。

而且,回复【书本】后,能够收取笔者引荐的各种 Java 从入门到架构的书本。

来吧,骚年~


版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。