加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Java 8顶用法优雅的Stream,机能也优雅吗?

发布时间:2019-03-23 10:52:33 所属栏目:建站 来源:CarpenterLee
导读:之前的文章中我们先容了Java 8中Stream相干的API,我们提到Stream API可以极大进步Java措施员的出产力,让措施员写出高服从、干净、简捷的代码。 那么,Stream API的机能到底怎样呢,代码整洁的背后是否意味着机能的消费呢?本文我们对Stream API的机能一
副问题[/!--empirenews.page--]

之前的文章中我们先容了Java 8中Stream相干的API,我们提到Stream API可以极大进步Java措施员的出产力,让措施员写出高服从、干净、简捷的代码。

那么,Stream API的机能到底怎样呢,代码整洁的背后是否意味着机能的消费呢?本文我们对Stream API的机能一探毕竟。

为担保测试功效真实可信,我们将JVM运行在-server模式下,测试数据在GB量级,测试呆板回收常见的商用处事器,设置如下:

1.测试要领与数据

机能测试并不是轻易的事,Java机能测试更费劲,由于假造机对机能的影响很大,JVM对机能的影响有两方面:

   1.GC的影响。GC的举动是Java中很欠好节制的一块,为增进确定性,我们手动指定行使CMS网络器,并行使10GB牢靠巨细的堆内存。详细到JVM参数就是-XX:+UseConcMarkSweepGC -Xms10G -Xmx10G

     2.JIT(Just-In-Time)即时编译技能。即时编译技能会将热门代码在JVM运行的进程中编译成当地代码,测试时我们会先对措施预热,触发对测试函数的即时编译。相干的JVM参数是-XX:CompileThreshold=10000。

Stream并行执行时用到ForkJoinPool.commonPool()获得的线程池,为节制并行度我们行使Linux的taskset呼吁指定JVM可用的核数。

测试数据由措施随机天生。为防备一次测试带来的发抖,测试4次求出均匀时刻作为运行时刻。

2.根基范例迭代

测试内容:找出整型数组中的最小值。比拟for轮回外部迭代和Stream API内部迭代机能。

测试措施IntTest,测试功效如下图:

Java 8顶用法优雅的Stream,机能也优雅吗?

图中展示的是for轮回外部迭代耗时为基准的时刻比值。说明如下:

  1. 对付根基范例Stream串行迭代的机能开销明明高于外部迭代开销(两倍);
  2. Stream并行迭代的机能比串行迭代和外部迭代都好。

并行迭代机能跟可操作的核数有关,上图中的并行迭代行使了所有12个核,为考查行使核数对机能的影响,我们专门测试了差异核数下的Stream并行迭代结果:

说明,对付根基范例:

  1. 行使Stream并行API在单核环境下机能很差,比Stream串行API的机能还差;
  2. 跟着行使核数的增进,Stream并行结果逐渐变好,比行使for轮回外部迭代的机能还好。

以上两个测试声名,对付根基范例的简朴迭代,Stream串行迭代机能更差,但多核环境下Stream迭代机遇能较好。

2.工具迭代

接下来我们再来看工具的迭代结果。

测试内容:找出字符串列表中最小的元素(天然次序),比拟for轮回外部迭代和Stream API内部迭代机能。

测试措施StringTest,测试功效如下图:

功效说明如下:

  1. 对付工具范例Stream串行迭代的机能开销如故高于外部迭代开销(1.5倍),但差距没有根基范例那么大。
  2. Stream并行迭代的机能比串行迭代和外部迭代都好。

再来单独考查Stream并行迭代结果:

说明,对付工具范例:

  1. 行使Stream并行API在单核环境下机能比for轮回外部迭代差;
  2. 跟着行使核数的增进,Stream并行结果逐渐变好,多核带来的结果明明。

以上两个测试声名,对付工具范例的简朴迭代,Stream串行迭代机能更差,但多核环境下Stream迭代机遇能较好。

3.伟大工具归约

从尝试一、二的功效来看,Stream串行执行的结果都比外部迭代差(许多),是不是声名Stream真的不可了?先别下结论,我们再来考查一下更伟大的操纵。

测试内容:给定订单列表,统计每个用户的总买卖营业额。比拟行使外部迭代手动实现和Stream API之间的机能。

我们将订单简化为<userName, price, timeStamp>组成的元组,并用Order工具来暗示。测试措施ReductionTest,测试功效如下图:

说明,对付伟大的归约操纵:

  1. Stream API的机能广泛好于外部手动迭代,并行Stream结果更佳;

再来考查并行度对并行结果的影响,测试功效如下:

说明,对付伟大的归约操纵:

行使Stream并行归约在单核环境下机能比串行归约以及手动归约都要差,简朴说就是最差的;

跟着行使核数的增进,Stream并行结果逐渐变好,多核带来的结果明明。

以上两个尝试声名,对付伟大的归约操纵,Stream串行归约结果好于手动归约,在多核环境下,并行归约结果更佳。我们有来由信托,,对付其他伟大的操纵,Stream API也能示意出相似的机能示意。

2.结论

上述三个尝试的功效可以总结如下:

对付简朴操纵,好比最简朴的遍历,Stream串行API机能明明差于表现迭代,但并行的Stream API可以或许施展多核特征。

对付伟大操纵,Stream串行API机能可以和手动实现的结果对抗,在并行执行时Stream API结果远超手动实现。

以是,假如出于机能思量,

1. 对付简朴操纵保举行使外部迭代手动实现

2. 对付伟大操纵,保举行使Stream API,

3. 在多核环境下,保举行使并行Stream API来施展多核上风

4.单核环境下不提议行使并行Stream API

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读