PHP中的for循环和使用range的foreach循环的区别

24

这些选项中哪个更适合于性能和可读性?

foreach(range(0,10000) as $i) {} // 3.847 ms

for($i = 0; $i < 10000; ++$i) {} // 0.663 ms

编辑:进行了基准测试,最后一个版本快了近6倍。


4
不应该有太大影响,但我猜测下面的那个更快,但你可能永远也感觉不到差别。 - adeneo
1
https://dev59.com/dHRA5IYBdhLWcg3w8iol - rOcKiNg RhO
1
这完全取决于您的需求和手头的数据。 - anuj arora
1
微小的性能问题有时很棘手……(会让你把注意力从实际瓶颈所在的地方转移开) - itachi
1
基准测试:https://3v4l.org/COc0o。 - Nabil Kadimi
显示剩余2条评论
6个回答

20

传统的 for 循环比 foreach + range 更快。前者只使用整数比较和递增,而后者必须创建一个(可能很大的)数组,然后通过移动内部数组指针并检查是否到达末尾来提取每个元素。

如果您执行此操作,您会发现普通的 forforeach + range 快两倍:

$t0 = microtime(true);
for ($i = 0; $i < 100000; $i++) {
}
echo 'for loop: ' . (microtime(true) - $t0) . ' s', PHP_EOL;

$t0 = microtime(true);
foreach (range(0, 100000) as $i) {
}
echo 'foreach + range loop: ' . (microtime(true) - $t0) . ' s', PHP_EOL;

在大多数情况下,如果你需要迭代一定次数,使用传统的for循环更好,但最终你不会在大多数场景中看到明显的性能提升(请注意,上面的示例迭代了10万次,如果你减少迭代次数,差异就会更小)。


8

如果这很关键,

for($i = 0; $i < 1000; ++$i) {}

比...更快
for($i = 0; $i < 1000; $i++) {}

但是在仅1000个迭代中,你不会真正注意到太大的差别。

微观优化是否真的如此重要?如果是这样,为什么不直接设置一些测试运行来比较不同的选项呢?


2
for ($i=1000; $i--;) {} 倒序循环会更快,不是吗? - adeneo
1
@adeneo - 可能可以更快,但是你可以通过使用--$i而不是$i--来运行得更快....它仍然需要更多的迭代才能真正看到速度上的差异。 - Mark Baker
应该会更快,因为没有检查循环是否超过了限制,它只是在达到零时自动停止。在 JavaScript 中进行大量迭代时,我实际上注意到了一些差异,但从未真正在 PHP 中测试过。 - adeneo
1
@adeneo - 当然,这完全取决于您在循环内部执行的操作是否依赖于 $i;如果是这样的话,顺序是否重要... 这是一个不错的技巧,我可以看到它有几个用途。 - Mark Baker
2
在这种情况下,最好使用while(--$i) {},这样更易读,也可能更快。 - Cyril

1

比较一些 PHP 函数的执行速度

使用 for 循环:

for() 循环 使用 count() 耗时 20.86401 毫秒

for() 循环 不使用 count() 耗时 7.09796 毫秒

使用 count() 的意思是: for ($i = 1; $i < count($myarr); ++ $i) {..

而 foreach() 循环:

foreach() 耗时 11.16920 毫秒

foreach() 带 KEY 耗时 12.35318 毫秒

这两个都是在同一个数组上完成的,它们各自的执行时间都显示在了 forforeach 上。它们都是语言结构,它们的执行速度会更快,因此除非您在一个包含数千条记录的数组上使用它们,否则您不会注意到太大的差异。


0

0
在这种特定情况下(使用range()而不是从另一个作用域传递的数组)- foreach()将更快。 在几乎任何其他情况下,for()都会胜过它。

0

Foreach循环非常适合遍历使用键和值的数组。

例如,如果我有一个名为“User”的数组:

$User = array(
    'name' => 'Bob',
    'email' => 'bob@example.com',
    'age' => 200
);

我可以轻松地遍历它并仍然利用键:
foreach ($User as $key => $value) {
    echo $key.' is '.$value.'<br />';
}

这将打印出:

name is Bob
email is bob@example.com
age is 200

使用for循环时,保留键的使用更加困难。

当您在PHP中使用面向对象的实践时,您会发现几乎完全使用foreach,只有在处理数字或基于列表的事物时才使用for循环。 foreach还可以避免您使用count($array)来查找数组中元素的总数。


使用 for 循环,迭代关联数组并不难。只需通过 array_keys() 检索键,其余相同。 - itachi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接