当前位置: 首页 > 知识库问答 >
问题:

Java8流运行速度比for循环慢的关键指标?

柳坚白
2023-03-14

在大多数情况下,Java8流允许的代码比老式的for循环更易读。然而,根据我自己的经验和阅读的内容,使用stream而不是for循环可能会导致性能下降(或者偶尔会带来改进),这有时很难预测。

在一个大型项目中,为每个循环编写基准测试似乎是不可行的,因此,当决定是否用流替换for循环时,有哪些关键因素(例如,集合的预期大小、通过筛选移除的值的预期百分比、迭代操作的复杂度、缩减或聚合的类型,等等)可能给出将导致的性能更改的指示?

注意:这是我前面的问题的一个范围的缩小,因为我前面的问题过于宽泛(对于这个问题,并行流的方面在另一个SO问题中已经很好地涉及到了),所以让我们把这个问题限制在顺序流上。

共有1个答案

羊光辉
2023-03-14

这不仅“为每个循环编写基准测试是不可行的”,而且适得其反。一个特定的、特定于应用程序的循环在放入微基准时可能会执行完全不同的操作。

对于一个实际的应用程序,优化的标准规则适用:不要这样做。只要编写任何更易读的内容,并且只有在存在性能问题时才编写,然后对整个应用程序进行概要分析,以检查特定的循环或流使用是否真的是瓶颈。只有在这种情况下,您才可以在特定的瓶颈处尝试在两个习语之间切换,看看是否会有不同。

在大多数情况下,它不会。如果存在真正的性能问题,它将源于操作的类型,例如以O(N²)时间复杂度执行嵌套迭代等。此类问题不取决于您使用的是stream还是for循环,而且这两个习惯用法之间的微小性能差异不会改变代码的伸缩方式。

 类似资料:
  • 问题内容: 在大多数情况下,Java 8流允许比老式循环可读得多的代码。但是,根据我自己的经验和所阅读的内容,使用流而不是for循环可能会导致性能下降(或有时会有所改善),这有时很难预测。 在大型项目中,为每个循环编写基准测试似乎不可行,因此, 在决定是否用流替换循环时,关键因素是什么(例如,预期的集合大小,预期的百分比值被删除)。过滤,迭代操作的复杂性,归约或聚合的类型等) ,这些指标可能暗示可

  • 我已经创建了一个使用流执行矩阵乘法的模块。可以在这里找到:https://github.com/firefly-math/firefly-math-lineal-real/ 当我在大小为100x100和1000x1000的矩阵上运行基准测试时,发现Apache Commons Math(使用for循环)比相应的流实现快10倍(大致)。 我在基准测试中做错了什么吗(希望是:))? 我添加了测试的方法

  • 考虑到我有2个CPU核心的事实,并行版本不是应该更快吗?有人能给我一个提示为什么并行版本比较慢吗?

  • 关于函数式编程的宣传太多了,特别是新的Java8Streams API。它被标榜为旧的好循环和命令式范例的很好的替代。的确,有时它看起来很漂亮,而且做得很好。但是性能呢? 例如。这是一篇关于它的好文章:Java8:No more loops使用循环,只需一次迭代就可以完成所有的工作。但是使用一个新的流API,您将会使用多个循环,这会使它慢得多(对吗?)。看看他们的第一个样本。循环在大多数情况下甚至

  • 我们已经使用jmap在Java 6下运行的大型多服务器应用程序上测量堆大小大约2年了。我们每分钟测量一次。每次测量所用的时间(经过的时间)不到1秒。 我们现在正在Java 7下测试同一个应用程序。现在突然之间,jmap通常需要10秒、20秒,有时甚至更长时间,而且它似乎慢了下来(甚至可能停止!)在那段时间里,JVM。 我们在jmap输出中看到的唯一区别(Java6和Java7之间)是关于有多少字符

  • 问题内容: ECMAScript 6应该提供块范围,而不会引起麻烦。有人可以解释为什么在函数下面的代码中解析为循环中的最后一个值(与一样),而不是当前迭代中的值吗? 根据MDN在这样的循环中使用应将变量绑定在循环主体的范围内。当我在块中使用临时变量时,事情按我期望的那样工作。为什么有必要? 我使用Traceur和来测试了脚本。 问题答案: quin着眼睛的答案不再是最新的。在ECMA 6规范中,指