作为一名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 秒 /
从上面的测试中我们可以明显的得出两条结论:
1、for循环遍历的效率是低于foreach循环遍历2、for循环在外部做count和在条件中做count比较较,第一种效率更高
那么第二个问题:效率高的缘故原由是什么呢?在探求这个答案之前我们先磋商第三个问题,我们看一下事理分别是什么。
for 循环:
每次从$i开始,每次循环都须要判断$i是否小于count,这占用了很大一部分韶光
小于连续,否则终止循环
foreach:
1、foreach 依赖 IEnumerable. 2、第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个工具 并 赋给a, 3、往后每次再实行 var a in GetList() 的时候 调用 MoveNext.直到循环结束. 4、期间GetList()方法只实行一次. 5、从上面是剖析我们明显可以得出结论: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在性能上貌似遍历不一样的数据会有不一样的性能差别,比如链表或者数组,这个也是我最近有所迷惑的。