首先,我了解90%的应用程序中的性能差异完全无关紧要,但是我只需要知道哪个是更快的构造即可。那…
当前网上可用的信息令人困惑。许多人说foreach不好,但是从技术上讲应该更快,因为它假定可以简化使用迭代器编写数组遍历的过程。再次被认为是更快的迭代器,但是在PHP中显然还很慢(或者这不是PHP吗?)。我说的是数组函数:next()prev()reset()等,如果它们甚至是函数,而不是看起来像函数的PHP语言功能之一。
稍微缩小一点 :我对以大于1的步长遍历数组并不感兴趣(也没有负步长,即反向迭代)。我也对遍历任意点(长度为0)不感兴趣。我也看不到有规则地操纵具有1000个以上键的数组,但是我确实看到一个数组在应用程序的逻辑中被遍历了多次!另外,对于操作,主要仅是字符串操作和回显。
我到处都能听到:
foreach
for
while
$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
简而言之:
有人可以解释吗?
PHP版本5.3.0
编辑:答案 在这里人们的帮助下,我得以整理出所有问题的答案。我在这里总结一下:
谢谢所有尝试提供帮助的人。
对于任何简单的遍历,我可能都会坚持使用foreach(非参考版本)。
我个人的观点是在上下文中使用有意义的内容。我个人几乎从未使用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…
Premature Optimization Is The Root Of All Evil
编辑: 根据评论,我决定进行快速基准测试…
$a = array(); for ($i = 0; $i < 10000; $i++) { $a[] = $i; } $start = microtime(true); foreach ($a as $k => $v) { $a[$k] = $v + 1; } echo "Completed in ", microtime(true) - $start, " Seconds\n"; $start = microtime(true); foreach ($a as $k => &$v) { $v = $v + 1; } echo "Completed in ", microtime(true) - $start, " Seconds\n"; $start = microtime(true); foreach ($a as $k => $v) {} echo "Completed in ", microtime(true) - $start, " Seconds\n"; $start = microtime(true); foreach ($a as $k => &$v) {} echo "Completed in ", microtime(true) - $start, " Seconds\n";
结果:
Completed in 0.0073502063751221 Seconds Completed in 0.0019769668579102 Seconds Completed in 0.0011849403381348 Seconds Completed in 0.00111985206604 Seconds
因此,如果您要在循环中修改数组,则使用引用的速度要快几倍…
而且,仅引用的开销实际上比复制数组要少(这在5.3.2上)…因此(至少在5.3.2上)看起来好像引用的速度明显更快…