reduce方法中的Java 9流更改

时间:2018-03-12 19:42:25

标签: java java-stream

我最近开始比较Java与Kotlin的性能,经过fisrt尝试后我发现了一些奇怪的东西。

我在减少流/列表时运行JHM基准测试,因为预期的Java流更快,但我注意到了其他内容。

Stream<Long>.reduce(0L, (a, b) -> a + b);

明显慢于:

Stream<Long>.reduce( (a, b) -> a + b).orElse(0L);

流大小是~50k元素,输入是相同的(代码可以在这里找到: https://github.com/mariusz-zawadzki/kotlin-vs-java-jmh

所以我的问题是:有人能指出我在java 9中发生的改善性能的事情吗?

编辑:

在进一步研究之后,我发现其他类型的操作没有差异,只有Long。 在将map(Long :: valueOf)转换为mapToLong(Long :: valueOf)之后,性能上的java 8和9之间没有区别,也没有使用或减少累加器的任何差异。

所以我目前的猜测是:在java 9中有一个优化,它以某种方式改变/知道如何将Stram更改为LongStream或者在那里摆脱装箱/拆箱。结论:Stream.reduce(BinaryOperator)具有与LongStream.reduce相同的性能,但仅限于java 9.

Java 9:
MyBenchmark.testJava                  thrpt  200  1234,795 ? 13,398  ops/s
MyBenchmark.testJavaAcumulator        thrpt  200  1234,981 ?  1,994  ops/s
MyBenchmark.testJavaObject            thrpt  200  1216,849 ?  6,028  ops/s
MyBenchmark.testJavaObjectAcumulator  thrpt  200   933,023 ?  5,864  ops/s
Java 8
Benchmark                              Mode  Cnt     Score   Error  Units
MyBenchmark.testJava                  thrpt  200  1199,363 ? 3,870  ops/s
MyBenchmark.testJavaAcumulator        thrpt  200  1195,621 ? 9,716  ops/s
MyBenchmark.testJavaObject            thrpt  200   986,778 ? 4,852  ops/s
MyBenchmark.testJavaObjectAcumulator  thrpt  200   993,045 ? 2,600  ops/s

0 个答案:

没有答案