首页 > 解决方案 > 与“for”循环相比,为什么 java 流的性能会因工作量较大而下降?

问题描述

我之前有一个关于解释 JMH 输出的问题,这个问题大部分都得到了回答,但我用另一个相关问题更新了这个问题,但最好把它作为一个单独的问题。

这是最初的问题:验证简单 for/lambda 比较的 JMH 测量值

我的问题与特定“工作”级别的流性能有关。上一个问题的以下摘录结果说明了我想知道的内容:

Benchmark                                            Mode  Cnt          Score         Error  Units
MyBenchmark.shortLengthConstantSizeFor              thrpt  200  132278188.475 ± 1132184.820  ops/s
MyBenchmark.shortLengthConstantSizeLambda           thrpt  200   18750818.019 ±  171239.562  ops/s
MyBenchmark.mediumLengthConstantSizeFor             thrpt  200   55447999.297 ±  277442.812  ops/s
MyBenchmark.mediumLengthConstantSizeLambda          thrpt  200   15925281.039 ±   65707.093  ops/s
MyBenchmark.longerLengthConstantSizeFor             thrpt  200    3551842.518 ±   42612.744  ops/s
MyBenchmark.longerLengthConstantSizeLambda          thrpt  200    2791292.093 ±   12207.302  ops/s
MyBenchmark.longLengthConstantSizeFor               thrpt  200       2984.554 ±      57.557  ops/s
MyBenchmark.longLengthConstantSizeLambda            thrpt  200        331.741 ±       2.196  ops/s

我期待,随着测试从较短的列表移动到较长的列表,流测试的性能应该接近“for”测试的性能。

我看到在“短”列表中,流性能是“for”性能的 14%。对于中等列表,它是 29%。对于更长的列表,它是 78%。到目前为止,趋势是我所期待的。然而,对于长名单,它是 11%。出于某种原因,与“for”相比,300k 的列表大小(而不是 300)导致流的性能下降。

我想知道是否有人可以证实这样的结果,以及他们是否对为什么会发生有任何想法。

我在装有 Java 8 的 Win7 笔记本电脑上运行它。

标签: javajava-streambenchmarkingjmh

解决方案


嗯,与“for 循环”相比,流是 Java 的一个全新补充,JIT 编译器并没有对它们进行任何复杂的优化,但它对数组或集合上的循环所做的优化。


推荐阅读