我最近开始比较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