PHP 中 foreach和for循环哪个效率更高
for循环遍历(count在内部):
$big_Array = range(0,1000000,1); $start_For_Time = microtime_float(); for ($i=0;$i<count($big_Array);$i++) { $i; } $end_For_Time = microtime_float(); $for_Time = $end_For_Time - $start_For_Time; echo for循环遍历耗时:.$for_Time.<br>; //for循环遍历(count在内部)耗时:0.039999961853027
for循环遍历(count在外部):
$big_Array = range(0,1000000,1); $start_For_Time = microtime_float(); $array_Count = count($big_Array); for ($i=0;$i<$array_Count;$i++) { $i; } $end_For_Time = microtime_float(); $for_Time = $end_For_Time - $start_For_Time; echo for循环遍历耗时:.$for_Time.<br>; //for循环遍历(count在外部)耗时:0.023999929428101
for循环 数组为固定长度
$start_For_Time = microtime_float(); for ($i=0;$i<1000000;$i++) { $i; } $end_For_Time = microtime_float(); $for_Time = $end_For_Time - $start_For_Time; echo for循环遍历耗时:.$for_Time.<br>; //for循环遍历(数组为固定长度)耗时:0.01200008392334
foreach循环遍历:
$big_Array = range(0,1000000,1); $start_Foreach_Time = microtime_float(); foreach ($big_Array as $key=>$val) { $key; } $end_Foreach_Time = microtime_float(); $foreach_Time = $end_Foreach_Time - $start_Foreach_Time; echo foreach循环遍历耗时:.$foreach_Time; // foreach循环遍历耗时:0.019999980926514
时间计算:
/** * 时间统计函数 */ private function microtime_float($time = null) { list($usec, $sec) = explode( , $time ? $time : microtime()); return ((float)$usec + (float)$sec); }
从上面的测试中我们可以明显的得出两条结论:
1、在数组长度未知的情况下: for(count在内部) < for(count在外部) < foreach(最快) 2、在数组长度已知的情况下: for循环比foreach更快
那么第二个问题:效率高的原因是什么呢?在寻找这个答案之前我们先探讨第三个问题,我们看一下原理分别是什么。
for循环
每次从$i开始,每次循环都需要判断$i是否小于count,这占用了很大一部分时间 小于继续,否则终止循环
foreach遍历
foreach 依赖 IEnumerable. 第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a, 以后每次再执行 var a in GetList() 的时候 调用 MoveNext.直到循环结束. 期间GetList()方法只执行一次.