for和foreach哪个效率更高?为什么?-php教程

资源魔 36 0
写这篇文章的缘由次要是正在开发进程中忽然有如下几个疑难,特抽出工夫深度探索一下,以加深本身对php的了解。

一、作为一位phper,for以及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 'for轮回遍历耗时:'.$for_Time.'<br>';
}

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;
}

工夫较量争论办法:

/**
 *  工夫统计函数
 */
private function microtime_float($time = null)
{
   list($usec, $sec) = explode(' ', $time ? $time : microtime());
   return ((float)$usec + (float)$sec);
}

看一下两种形式耗时

/*
 * 输入后果:第一种状况:先count正在for轮回遍历耗时:0.028002023696899 秒
 *                         foreach轮回遍历耗时:0.003000020980835 秒
 *        第二种状况:正在for轮回前提中做count遍历耗时:0.095005035400391 秒
 *                            foreach轮回遍历耗时:0.0040009021759033 秒
 * */

从下面的测试中咱们能够显著的患上出两条论断:

一、for轮回遍历的效率是低于foreach轮回遍历
二、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轮回。

BUT:现实真的是这样吗?有人会说这个例子曾经很显著了啊,论断了如指掌,莫非另有其余的可能吗?

我感觉现实没这么简略,假如真的是这样,for轮回存正在的意思是甚么呢?

既然foreach效率高于for这么多倍,就间接都用foreach没有就好了吗?集体感觉我测试的这个例子有肯定的局限性,其实不能作为评价两个轮回形式效率高下的相对根据。

不外,关于咱们phper来讲,失常工作傍边仍是应用foreach轮回遍历比拟好,至于编译层是若何工作的没须要触及太深,假如有兴味能够深度钻研一下。

如下是网友回复:

for存正在的意思是由于有一些状况是foreach欠好完成的,详细的你能够看一看Effective Java的第46条,尽管你是做php的,但根本都是雷同的吧!书外面保举应用foreach模式,然而有如下三种状况没有合适: 1. 过滤-假如需求正在荟萃上遍历且移去选定的元素,就要应用显式的迭代,并挪用它的remove办法。 2. 转换-假如需求正在list或数组上遍历且要交换局部或一切的元素值,则需求list的迭代器或数组的索引去设置这些值。 3. 平行迭代-假如需求并行的遍历多个荟萃,则需求显式的管制迭代器或索引变量,以便一切的迭代器或索引能协同推动 而后for以及foreach正在功能上貌似遍历纷歧样的数据会有纷歧样的功能差异,比方链表或许数组,这个也是我比来有所纳闷的。

相干保举:《PHP教程》

以上就是for以及foreach哪一个效率更高?为何?的具体内容,更多请存眷资源魔其它相干文章!

标签: php开发教程 php开发资料 php开发自学 foreach for

抱歉,评论功能暂时关闭!