开发者社区> 问答> 正文

PHP中FOR与FOREACH的性能

首先,我了解90%的应用程序中的性能差异完全无关紧要,但是我只需要知道哪个是更快的构造即可。那...

当前网上可用的信息令人困惑。许多人说foreach不好,但是从技术上讲应该更快,因为它假设可以简化使用迭代器编写数组遍历的过程。再次被认为是更快的迭代器,但是在PHP中显然还很慢(或者这不是PHP吗?)。我说的是数组函数:next()prev()reset()等,如果它们甚至是函数,而不是那些看起来像函数的PHP语言功能之一。

稍微缩小一点:我对以大于1的步长遍历数组并不感兴趣(也没有负步长,即反向迭代)。我也对遍历任意点(长度为0)不感兴趣。我也看不到有规则地操纵具有1000个以上键的数组,但是我确实看到在应用程序逻辑中数组被多次遍历了!此外,对于操作,很大程度上仅是字符串操作和回显。

以下是一些参考站点: http : //www.phpbench.com/ http://www.php.lt/benchmark/phpbench.php

我到处都能听到:

foreach慢,因此for/ while快 PHP foreach复制它迭代的数组;为了更快,您需要使用参考 像这样的代码:比$key = array_keys($aHash); $size = sizeOf($key); for ($i=0; $i < $size; $i++)foreach 这是我的问题。我写了这个测试脚本:http : //pastebin.com/1ZgK07US,无论我运行脚本多少次,我都会得到如下信息:

foreach 1.1438131332397 foreach (using reference) 1.2919359207153 for 1.4262869358063 foreach (hash table) 1.5696921348572 for (hash table) 2.4778981208801 简而言之:

foreach比foreach参考更快 foreach 比...快 for foreach比for散列表快 有人可以解释吗?

难道我做错了什么? PHP foreach参考对象真的有所作为吗?我的意思是,如果您通过引用,为什么不复制它? foreach语句的等效迭代器代码是什么?我已经在网上看到了一些,但每次测试它们时,时机都会变差。我还测试了一些简单的迭代器构造,但似乎从未获得过像样的结果-PHP中的数组迭代器太糟糕了吗? 除了FOR / FOREACH(和WHILE)以外,是否有更快的方法/方法/构造来遍历数组? PHP版本5.3.0 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-07 22:50:16 698 0
1 条回答
写回答
取消 提交回答
  • 我个人的观点是在上下文中使用有意义的内容。我个人几乎从未使用for过数组遍历。我将其用于其他类型的迭代,但是foreach太简单了……在大多数情况下,时间差将最小。

    要注意的最大事情是:

    for ($i = 0; $i < count($array); $i++) { 这是一个昂贵的循环,因为它在每次迭代中都调用计数。只要您不这样做,我就认为这并不重要...

    至于有区别的参考,PHP使用写时复制,因此,如果您不写数组,则循环时的开销相对较小。但是,如果您开始修改数组中的数组,那么您将开始看到它们之间的差异(因为一个人将需要复制整个数组,而引用只能进行内联修改)...

    至于迭代器,foreach等效于:

    $it->rewind(); while ($it->valid()) { $key = $it->key(); // If using the $key => $value syntax $value = $it->current();

    // Contents of loop in here
    
    $it->next();
    

    } 至于有更快的迭代方法,这实际上取决于问题。但是我真的要问,为什么?我知道要提高效率,但我认为您是在浪费时间进行微优化。记住Premature Optimization Is The Root Of All Evil...

    2020-02-07 22:50:33
    赞同 展开评论 打赏
问答分类:
PHP
问答地址:
问答排行榜
最热
最新

相关电子书

更多
PHP安全开发:从白帽角度做安全 立即下载
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载
复杂PHP系统性能瓶颈排查及优化 立即下载