【发布时间】:2014-01-25 21:39:35
【问题描述】:
我在 SO 偶然发现了“Find the last element of an array while using a foreach loop in PHP”这个问题。
comments 用户“johndodo”声称在 foreach 循环中每次访问 count($array) 不会造成性能损失。
"[...] 在 PHP 中,每次访问 count($arr) 都没有性能损失。原因是项目计数在内部保存为数组标题中的特殊字段,而不是在--飞。[...]”
所以:
foreach ($array as $line) {
$output .= ' ' . $line;
// add LF if not the last line
if ($array[count($array) - 1] != $line) {
$output .= "\n";
}
}
应该和以下一样快:
$arrayLen = count($array) - 1;
foreach ($array as $line) {
$output .= ' ' . $line;
// add LF if not the last line
if ($array[$arrayLen] != $line) {
$output .= "\n";
}
}
好吧,事实并非如此。在进行分析时,可以看出在第一个示例中花费了大量时间来执行count()。 是因为用户提出的声明没有实际意义,还是因为我们在紧凑的 foreach 循环中调用了一个函数?
【问题讨论】:
-
因为您正在为循环的每次迭代调用一个函数。这是创建 for 循环时特别常见的错误:即 for($i = 0; $i
-
是的,假设数据集很大,带有
$arrayLen = count();的第二个版本要好得多。并且保持一般的良好做法。 -
找出答案的一个好方法是将这个循环放入另一个循环中(比如说 10,000 次迭代),看看它需要多长时间......
-
这是一个函数调用的开销:但是数组结构在内部包含一个计数值,所以它不需要每次遍历数组计算每个元素......即使这样,性能更大的数组差异很明显
-
你可以使用 implode() 而不是循环进行测试,但要注意内存开销
标签: php arrays performance foreach