Rumah >pembangunan bahagian belakang >tutorial php >PHP中for和foreach哪个效率高一些?

PHP中for和foreach哪个效率高一些?

PHPz
PHPzasal
2016-06-13 12:00:332525semak imbas

PHP中for和foreach哪个效率高一些?

for和foreach那个效率高?原因是什么?

PHP中for和foreach效率高的是foreach

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 &#39;for循环遍历耗时:&#39;.$for_Time.&#39;<br>&#39;;
}

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 &#39;foreach循环遍历耗时:&#39;.$foreach_Time;
}

时间计算方法:

/**
 *  时间统计函数
 */
private function microtime_float($time = null)
{
   list($usec, $sec) = explode(&#39; &#39;, $time ? $time : microtime());
   return ((float)$usec + (float)$sec);
}

看一下两种方式耗时

/*
 * 输出结果:第一种情况:先count在for循环遍历耗时:0.028002023696899 秒
 *                         foreach循环遍历耗时:0.003000020980835 秒
 *        第二种情况:在for循环条件中做count遍历耗时:0.095005035400391 秒
 *                            foreach循环遍历耗时:0.0040009021759033 秒
 * */

从上面的测试中我们可以明显的得出两条结论:

1、for循环遍历的效率是低于foreach循环遍历

2、for循环在外部做count和在条件中做count相比较,第一种效率更高

效率高的原因是什么呢?在寻找这个答案之前我们先探讨原理分别是什么。

for 循环:

每次从$i开始,每次循环都需要判断$i是否小于count,这占用了很大一部分时间
小于继续,否则终止循环

foreach:

foreach 依赖 IEnumerable.

第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a,

以后每次再执行 var a in GetList() 的时候 调用 MoveNext.直到循环结束.

期间GetList()方法只执行一次.

从上面是分析我们明显可以得出结论:php 的foreach循环效率是大大高于for循环。也许有很大的一个原因是for 要进行很多次条件判断。所以以后能用foreach的地方就用foreach,可以提高1倍的效率。

BUT:事实真的是这样吗?有人会说这个例子已经很明显了啊,结论一目了然,难道还有其他的可能吗?

我觉得事实没这么简单,如果真的是这样,for循环存在的意义是什么呢?

既然foreach效率高于for这么多倍,就直接都用foreach不就行了吗?个人觉得我测试的这个例子有一定的局限性,并不能作为评估两个循环方式效率高低的绝对依据。

不过,对于我们phper来说,正常工作当中还是使用foreach循环遍历比较好,至于编译层是如何工作的没必要涉及太深,如果有兴趣可以深度研究一下。

更多相关知识,请访问 PHP中文网!!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn