java - 与“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 笔记本电脑上运行它。
解决方案
嗯,与“for 循环”相比,流是 Java 的一个全新补充,JIT 编译器并没有对它们进行任何复杂的优化,但它对数组或集合上的循环所做的优化。
推荐阅读
- excel - 使用集合作为键的 Microsoft 脚本运行时字典
- angular - 如何在不使用 ngx-Admin Starter Kit 的情况下使用 ngx-Admin 组件?
- c#-4.0 - SMTP 服务器需要安全连接或客户端未通过身份验证。服务器响应为:5.7.57 客户端未通过身份验证发送
- data-structures - 在不使用任何额外空间的情况下反转队列
- angular - Wifiwizard 已添加到我的配置和 package.json 文件中,但我在 module.ts 文件中找不到导入
- javascript - 使用 JavaScript 和 Chart.js 根据请求创建多个图表
- pandas - 如何将多列分组为逗号分隔的输出
- java - 无法使用 servlet 和 JavaMail 发送电子邮件
- java - Java 抛出“PersistenceException:SQLGrammarException:无法提取结果集”
- c# - 使用 rest 更新 azure cdn 中的 blob 内容类型