for和foreach哪个效率更高?为什么?
发布:smiling 来源: PHP粉丝网 添加日期:2022-06-27 11:40:03 浏览: 评论:0
写这篇文章的原因主要是在开发过程中突然有以下几个疑问,特抽出时间深度探究一下,以加深自身对php的理解。
1、作为一名phper,for和foreach循环遍历几乎每天都在使用,那么这两种遍历方式哪一种效率更高呢?
2、效率高的原因是什么呢?
3、原理分别是什么呢?
首先要解决第一个问题,我们可以通过一个简单的测试看一下测试结果,测试代码如下:
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:
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在性能上貌似遍历不一样的数据会有不一样的性能差别,比如链表或者数组,这个也是我最近有所疑惑的。
Tags: for foreach
- 上一篇:PHP中常用header头汇总
- 下一篇:最后一页
相关文章
- ·phpMyAdmin隐藏mysql与information_schema数据库(2014-01-12)
- ·PHP sprintf() 函数使用方法详解(2014-03-12)
- ·php分割字符串并循环输出(2014-03-13)
- ·Warning:chmod() has been disabled for security reasons in(2014-08-23)
- ·php $_POST获取html表单form数据教程(2014-08-29)
- ·php foreach 传值还是传引用(2014-09-13)
- ·php跨域提交form表单2种方法(2015-04-13)
- ·php 避免form表单重复提交的方法(2015-12-24)
- ·php 在处理 form 表单时提交多个 name 属性值相同的 input 标签 (2018-08-06)
- ·PHP中for循环与foreach的区别(2018-08-06)
- ·PHP判断FORM表单或URL参数来的数据是否为整数的方法(2019-11-11)
- ·foreach用法是什么?(2020-01-10)
- ·[PHP] foreach循环的引用赋值中出现的问题(2020-02-22)
- ·PHP学习之foreach循环时加&符号的说明(2020-03-05)
- ·php foreach循环中使用引用的问题(2020-05-16)
- ·php使用NumberFormatter格式化货币的方法(2021-05-17)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)