【问题标题】: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 然后忘记

标签: php performance for-loop


【解决方案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 的使用不限于当您要对其进行多次迭代时,例如,如果应用程序需要输出计数,它也会很有用;也许是一些分页或类似的。但是是的,变量的范围应该限制在需要的地方。
    猜你喜欢
    • 2018-11-20
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    相关资源
    最近更新 更多