写这篇文章的原因主要是在开发过程中突然有以下几个疑问,特抽出时间深度探究一下,以加深自身对php的理解。
1、作为一名phper,for和foreach循环遍历几乎每天都在使用,那么这两种遍历方式哪一种效率更高呢?
2、效率高的原因是什么呢?
3、原理分别是什么呢?
- 1
- 2
- 3
- 4
首先要解决第一个问题,我们可以通过一个简单的测试看一下测试结果,测试代码如下:
for循环遍历方法:
public function getForTime(){
$big_Array = range(0,1000000,1);
/* for循环遍历数组示例 */
$start_For_Time = $this->microtime_float();
//$array_Count = count($big_Array);
for ($i=0;$i<count($big_Array);$i++) {
$i;
}
$end_For_Time = $this->microtime_float();
$for_Time = $end_For_Time - $start_For_Time;
echo 'for循环遍历耗时:'.$for_Time.'<br>';
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
foreach循环遍历方法:
public function getForeachTime(){
$big_Array = range(0,1000000,1);
/* foreach循环遍历数组示例 */
$start_Foreach_Time = $this->microtime_float();
foreach ($big_Array as $key=>$val) {
$key;
}
$end_Foreach_Time = $this->microtime_float();
$foreach_Time = $end_Foreach_Time - $start_Foreach_Time;
echo 'foreach循环遍历耗时:'.$foreach_Time;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
时间计算方法:
/**
* 时间统计函数
*/
private function microtime_float($time = null)
{
list($usec, $sec) = explode(' ', $time ? $time : microtime());
return ((float)$usec + (float)$sec);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
看一下两种方式耗时
/*
* 输出结果:第一种情况:先count在for循环遍历耗时:0.028002023696899 秒
* foreach循环遍历耗时:0.003000020980835 秒
* 第二种情况:在for循环条件中做count遍历耗时:0.095005035400391 秒
* foreach循环遍历耗时:0.0040009021759033 秒
* */
- 1
- 2
- 3
- 4
- 5
- 6
从上面的测试中我们可以明显的得出两条结论:
1、for循环遍历的效率是低于foreach循环遍历
2、for循环在外部做count和在条件中做count相比较,第一种效率更高
- 1
- 2
- 3
那么第二个问题:效率高的原因是什么呢?在寻找这个答案之前我们先探讨第三个问题,我们看一下原理分别是什么。
for 循环:
每次从$i开始,每次循环都需要判断$i是否小于count,这占用了很大一部分时间
小于继续,否则终止循环
- 1
- 2
- 3
foreach:
foreach 依赖 IEnumerable.
第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a,
以后每次再执行 var a in GetList() 的时候 调用 MoveNext.直到循环结束.
期间GetList()方法只执行一次.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
从上面是分析我们明显可以得出结论:php 的foreach循环效率是大大高于for循环。