改进 PHP 'for' 循环

Posted

技术标签:

【中文标题】改进 PHP \'for\' 循环【英文标题】:Improve PHP 'for' loop [duplicate]改进 PHP 'for' 循环 【发布时间】:2016-05-09 15:49:21 【问题描述】:

当使用典型的for 循环时,phpStorm 建议更改它以获得更好的性能。我真的不明白这个建议。应该怎么改?

【问题讨论】:

点击 more 时 PHPStorm 的建议是什么?我很好奇为什么 PHPStorm 建议这样做。 只有analyses for loops and reports the usage blablabla :) foreach 然后忘记 【参考方案1】:

如果您在for 循环内执行count(),则每次迭代都会执行它,调用该函数会产生性能开销。

如果您在for 循环之前调用count() 并将结果分配给一个变量,然后与for 循环中的变量进行比较,您就没有函数调用开销,所以它更快

【讨论】:

【参考方案2】:

for($i = 0; $i <= count($data); $i++)

在此示例中,每次迭代都必须再次count($data)

for($i = 0, $iMax = count($data); $i <= $iMax; $i++)

在这个例子中,它只需要count($data) 一次。

这就是区别。

【讨论】:

参考见this post 大概这是假设$data在循环内没有改变长度,否则两者会不同。 @abligh 如果$data 在for 循环内改变长度,你可能一开始就不应该使用for 循环。不过我可能有偏见,我认为你不应该使用 for 循环。 $iMax 是一个非常糟糕的变量名称。它应该是$length 或更易读的东西。此外,使用foreach($array as $i => &$value) 将产生相同的结果,并且实际上可以与for() 循环一样快。 @Odalrick for 循环有其用途。然而,在 OP 的情况下,看一眼变量名称就表明 foreach 可能 是一个更好的主意。无论如何,我经常强烈支持foreach,因为它不关心其中有间隙的数组/结构,而且(IMO)看起来有点干净。【参考方案3】:

通过以您的方式进行循环,每次迭代都需要评估count($data)。如果列表中有很多项目,则可能需要一段时间(相对)来计算这些项目,并且每次都必须这样做。

它给你的提示是在开始时将一个变量设置为 count($data) 的值,然后将该变量用作循环限制,当它只计算一次时。

这可以通过两种方式完成:

$loopMax = count($data);
for ($i = 0; $i <= $loopMax; $i++) 
    // Your code here

或者

for ($i=0, $loopMax = count($data); $i <= $loopMax; $i++) 
    // your code here

【讨论】:

如果您出于某种原因要进行多次迭代,显然首选第一个。在其他时候,底部是首选,因为您应该始终努力限制变量的范围。 top 的使用不限于当您要对其进行多次迭代时,例如,如果应用程序需要输出计数,它也会很有用;也许是一些分页或类似的。但是是的,变量的范围应该限制在需要的地方。

以上是关于改进 PHP 'for' 循环的主要内容,如果未能解决你的问题,请参考以下文章

十条改进代码性能小建议

如何改进大数据的矢量化滑动窗口?

软工概论第二周个人项目四则运算二(改进)

如何用几行代码改进这个程序? [关闭]

为什么for循环在JavaScript构造函数中表现得很奇怪?[已关闭]

P1424 小鱼的航程(改进版)