这些选项中哪个更适合于性能和可读性?
foreach(range(0,10000) as $i) {} // 3.847 ms
for($i = 0; $i < 10000; ++$i) {} // 0.663 ms
编辑:进行了基准测试,最后一个版本快了近6倍。
这些选项中哪个更适合于性能和可读性?
foreach(range(0,10000) as $i) {} // 3.847 ms
for($i = 0; $i < 10000; ++$i) {} // 0.663 ms
编辑:进行了基准测试,最后一个版本快了近6倍。
传统的 for
循环比 foreach
+ range
更快。前者只使用整数比较和递增,而后者必须创建一个(可能很大的)数组,然后通过移动内部数组指针并检查是否到达末尾来提取每个元素。
如果您执行此操作,您会发现普通的 for
比 foreach
+ 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万次,如果你减少迭代次数,差异就会更小)。
如果这很关键,
for($i = 0; $i < 1000; ++$i) {}
for($i = 0; $i < 1000; $i++) {}
但是在仅1000个迭代中,你不会真正注意到太大的差别。
微观优化是否真的如此重要?如果是这样,为什么不直接设置一些测试运行来比较不同的选项呢?
for ($i=1000; $i--;) {}
倒序循环会更快,不是吗? - adeneowhile(--$i) {}
,这样更易读,也可能更快。 - Cyril比较一些 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 毫秒
这两个都是在同一个数组上完成的,它们各自的执行时间都显示在了 for
和 foreach
上。它们都是语言结构,它们的执行速度会更快,因此除非您在一个包含数千条记录的数组上使用它们,否则您不会注意到太大的差异。
Foreach循环非常适合迭代使用键和值的数组。 使用for循环时,保留键的使用更加困难。 http://www.c-sharpcorner.com/interviews/answer/2147/ 这可能会有所帮助
range()
而不是从另一个作用域传递的数组)- foreach()
将更快。
在几乎任何其他情况下,for()
都会胜过它。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