已经对Stream API的用法宣扬够多了,用起简捷直观,但机能到底怎么样呢?会不会有很高的机能损失?本节我们对Stream API的机能一探毕竟。
为担保测试功效真实可信,我们将JVM运行在-server
模式下,测试数据在GB量级,测试呆板回收常见的商用处事器,设置如下:
OS | CentOS 6.7 x86_64 |
CPU | Intel Xeon X5675, 12M Cache 3.06 GHz, 6 Cores 12 Threads |
内存 | 96GB |
JDK | java version 1.8.0_91, Java HotSpot(TM) 64-Bit Server VM |
测试所用代码在这里,测试功效汇总.
测试要领和测试数据
机能测试并不是容易的事,Java机能测试更费劲,因为虚拟机对机能的影响很大,JVM对机能的影响有两方面:
-XX:+UseConcMarkSweepGC -Xms10G -Xmx10G
-XX:CompileThreshold=10000
。Stream并行执行时用到ForkJoinPool.commonPool()
获得的线程池,为节制并行度我们利用Linux的taskset
呼吁指定JVM可用的核数。
测试数据由措施随机生成。为防备一次测试带来的发抖,测试4次求出平均时间作为运行时间。
尝试一 根基范例迭代
测试内容:找出整型数组中的最小值。比拟for轮回外部迭代和Stream API内部迭代机能。
测试措施IntTest,测试功效如下图:
图中展示的是for轮回外部迭代耗时为基准的时间比值。阐明如下:
并行迭代机能跟可操作的核数有关,上图中的并行迭代利用了全部12个核,为考查利用核数对机能的影响,我们专门测试了差异核数下的Stream并行迭代结果:
阐明,对付根基范例:
以上两个测试说明,对付根基范例的简朴迭代,Stream串行迭代机能更差,但多核环境下Stream迭代时机能较好。
尝试二 工具迭代
再来看工具的迭代结果。
测试内容:找出字符串列表中最小的元素(自然顺序),图纸加密,比拟for轮回外部迭代和Stream API内部迭代机能。
测试措施StringTest,测试功效如下图:
功效阐明如下:
再来单独考查Stream并行迭代结果:
阐明,对付工具范例:
以上两个测试说明,对付工具范例的简朴迭代,Stream串行迭代机能更差,但多核环境下Stream迭代时机能较好。
尝试三 巨大工具归约
从尝试一、二的功效来看,Stream串行执行的结果都比外部迭代差(许多),是不是说明Stream真的不可了?先别下结论,我们再来考查一下更巨大的操纵。
测试内容:给定订单列表,统计每个用户的总生意业务额。比拟利用外部迭代手动实现和Stream API之间的机能。
我们将订单简化为<userName, price, timeStamp>
组成的元组,并用Order
工具来暗示。测试措施ReductionTest,测试功效如下图:
阐明,对付巨大的归约操纵:
再来考查并行度对并行结果的影响,测试功效如下: