一、作为一位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
抱歉,评论功能暂时关闭!