当前位置: 首页 > 面试题库 >

Java 8流的运行速度是否会比for循环慢?

姚建树
2023-03-14
问题内容

for在大多数情况下,Java
8流允许比老式循环可读得多的代码。但是,根据我自己的经验和所阅读的内容,使用流而不是for循环可能会导致性能下降(或有时会有所改善),这有时很难预测。

在大型项目中,为每个循环编写基准测试似乎不可行,因此,
在决定是否for用流替换循环时,关键因素是什么(例如,预期的集合大小,预期的百分比值被删除)。过滤,迭代操作的复杂性,归约或聚合的类型等)
,这些指标可能暗示可能导致的性能变化?

注意:这是[我先前问题的缩小范围,该问题因过于广泛而被关闭(并且另一个SO问题已很好地涵盖了并行流的各个方面),因此我们仅将其限制为顺序流。


问题答案:

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

对于实际应用,适用优化的标准规则: 不要这样做 。只需编写更具可读性的内容,并且 仅在 出现性能问题时, 对整个应用程序 进行概要分析
以检查特定循环或流使用是否确实是瓶颈。只有在这种情况下,您才可以尝试在特定瓶颈处的两种习惯用法之间切换,以查看它是否有所作为。

在大多数情况下,不会。如果存在实际的性能问题,则将O(n²)取决于操作的类型,例如执行具有时间复杂度的嵌套迭代等。此类问题不取决于您使用的Streamfor循环还是循环以及这两者之间的微小性能差异。习惯用法不会改变代码的
扩展方式



 类似资料:
  • 在大多数情况下,Java8流允许的代码比老式的循环更易读。然而,根据我自己的经验和阅读的内容,使用stream而不是for循环可能会导致性能下降(或者偶尔会带来改进),这有时很难预测。 在一个大型项目中,为每个循环编写基准测试似乎是不可行的,因此,当决定是否用流替换循环时,有哪些关键因素(例如,集合的预期大小、通过筛选移除的值的预期百分比、迭代操作的复杂度、缩减或聚合的类型,等等)可能给出将导致的

  • 我们正在通过Cygwin脚本运行一个Windows.exe文件,并且遇到了性能问题。我看到过关于Cygwin性能问题的各种帖子,包括这篇文章,其中一篇文章的答案对Cygwin的内部结构进行了深入研究,让我认为可能存在问题。然而,这些帖子似乎更多的是关于启动时间、选项卡完成等。在我们启动一个基准测试猎巫之前,我希望问一句:如果从Cygwin vs.BAT中启动一个Windows.exe会运行得更慢,

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

  • 我有一个python for循环,它执行一个bash脚本,如下所示(我将其简化为只包含需要显示的内容),我需要它在for循环中同时运行所有这些bash脚本,但要等到它们全部完成后才能继续串联。bash脚本是我唯一希望并行运行的部分。它是在同一for循环的下游做一些需要串联完成的事情。这可能吗? 以下是系列作品。没有脚本的并行执行,因为。如果我删除. etc(),它几乎立即出错,下游的任何东西都不再

  • 当我执行这段代码时,输出是“140”,也就是“28*5”,但它应该是“150”,也就是“28+31+30+31+30”,它应该计算两个月“2月”和“7月”之间的天数...所以这意味着for循环不能正常工作还是怎么的?为什么会这样!你能帮我一下吗??PS:我试图将循环中的j++更改为j+1,但Android Studio说“这不是一个声明”

  • 这是我在解决欧拉项目205题时发现的。问题如下: 彼得有九个四面(金字塔形)骰子,每个骰子的面编号为1、2、3、4。科林有六个六面(立方体)骰子,每个骰子的面编号为1、2、3、4、5、6。 彼得和科林掷骰子比较总数:总数最高的赢。如果总数相等,结果是平局。 金字塔皮特击败立方体科林的概率是多少?将答案四舍五入至小数点后七位,格式为0.abcdefg 我用Guava写了一个简单的解决方案: 我所强调