php foreach、while性能比较


Posted in PHP onOctober 15, 2009

foreach是对数组副本进行操作(通过拷贝数组),而while则通过移动数组内部指标进行操作,一般逻辑下认为,while应该比foreach快(因为foreach在开始执行的时候首先把数组复制进去,而while直接移动内部指标。),但结果刚刚相反。
在循环里进行的是数组“读”操作,则foreach比while快:

foreach ($array as $value) { 
echo $value; 
} 
while (list($key) = each($array)) { 
echo $array[$key]; 
}

在循环里进行的是数组“写”操作,则while比foreach快:
foreach ($array as $key => $value) { 
echo $array[$key] = $value . '...'; 
} 
while (list($key) = each($array)) { 
$array[$key] = $array[$key] . '...'; 
}

总结:通常认为,foreach涉及到值复制,一定会比while慢,但实际上,如果仅仅是在循环里进行数组的读操作,那么foreach是很
快的,这是因为PHP采用的复制机制是“引用计数,写时复制”,也就是说,即便在PHP里复制一个变量,最初的形式从根本上说其实
仍然是引用的形式,只有当变量的内容发生变化时,才会出现真正的复制,之所以这么做是出于节省内存消耗得目的,同时也提升了
复制的效率。这样看来,foreach的高效读操作就不难理解了。另外,既然foreach不适合处理数组写操作,那么我们可以得出一个结
论,多数情况下,类似foreach ($array as $key => $value)形式的做数组写操作得代码都应该被替换成while (list($key) =
each($array))。这些技巧产生的速度差异在小项目里可能并不明显,但是在类似框架这样的大项目中,一次请求动辄便会涉及到几
百几千几万次数组循环操作,差异就会明显放大。
PHP 相关文章推荐
让你的PHP同时支持GIF、png、JPEG
Oct 09 PHP
php设计模式 State (状态模式)
Jun 26 PHP
使用php+Ajax实现唯一校验实现代码[简单应用]
Nov 29 PHP
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
Jun 01 PHP
PHP批量检测并去除文件BOM头代码实例
May 08 PHP
php实现网站留言板功能
Nov 04 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
Jun 15 PHP
php微信开发之百度天气预报
Nov 18 PHP
Yii2配置Nginx伪静态的方法
May 05 PHP
Yii2框架实现登录、退出及自动登录功能的方法详解
Oct 24 PHP
PHP7下协程的实现方法详解
Dec 17 PHP
thinkPHP框架整合tcpdf插件操作示例
Aug 07 PHP
php侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
Oct 15 #PHP
php 数学运算验证码实现代码
Oct 11 #PHP
用mysql触发器自动更新memcache的实现代码
Oct 11 #PHP
基于OpenCV的PHP图像人脸识别技术
Oct 11 #PHP
PHP 身份验证方面的函数
Oct 11 #PHP
使用zend studio for eclipse不能激活代码提示功能的解决办法
Oct 11 #PHP
关于页面优化和伪静态
Oct 11 #PHP
You might like
PHP对文件进行加锁、解锁实例
2015/01/23 PHP
PHP设置头信息及取得返回头信息的方法
2016/01/25 PHP
php安全配置记录和常见错误梳理(总结)
2017/03/28 PHP
Mozilla 表达式 __noSuchMethod__
2009/04/05 Javascript
js兼容的placeholder属性详解
2013/08/18 Javascript
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
2014/09/26 NodeJs
IE8中动态创建script标签onload无效的解决方法
2014/12/22 Javascript
jQuery实现的超简单点赞效果实例分析
2015/12/31 Javascript
移动适配的几种方案(三种方案)
2016/11/25 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
2017/02/19 Javascript
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
微信小程序--组件(swiper)详细介绍
2017/06/13 Javascript
详解vue.js根据不同环境(正式、测试)打包到不同目录
2018/07/13 Javascript
Vue源码探究之虚拟节点的实现
2019/04/17 Javascript
关于vue-cli 3配置打包优化要点(推荐)
2019/04/22 Javascript
JavaScript获取页面元素的常用方法详解
2019/09/28 Javascript
js键盘事件实现人物的行走
2020/01/17 Javascript
JS自定义右键菜单实现代码解析
2020/07/16 Javascript
Python使用random和tertools模块解一些经典概率问题
2015/01/28 Python
python实现查询苹果手机维修进度
2015/03/16 Python
详解Python中的文本处理
2015/04/11 Python
django 2.0更新的10条注意事项总结
2018/01/05 Python
python 如何将数据写入本地txt文本文件的实现方法
2019/09/11 Python
深入浅析Python 中的sklearn模型选择
2019/10/12 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
Python web如何在IIS发布应用过程解析
2020/05/27 Python
HTML5中如何显示视频呢 HTML5视频播放demo
2013/06/08 HTML / CSS
向全球直邮输送天然健康产品:iHerb.com
2020/05/03 全球购物
教师批评与自我批评心得体会
2014/10/16 职场文书
云冈石窟导游词
2015/02/04 职场文书
入党介绍人意见怎么写
2015/06/03 职场文书
中国梦党课学习心得体会
2016/01/05 职场文书
党员读书活动心得体会
2016/01/14 职场文书
python实战之一步一步教你绘制小猪佩奇
2021/04/22 Python
Windows中Redis安装配置流程并实现远程访问功能
2021/06/07 Redis
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS