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 set_magic_quotes_runtime() 函数过时解决方法
Jul 08 PHP
php做下载文件的实现代码及文件名中乱码解决方法
Feb 03 PHP
php摘要生成函数(无乱码)
Feb 04 PHP
win7下memCache的安装过程(具体操作步骤)
Jun 28 PHP
PHP不用递归遍历目录下所有文件的代码
Jul 04 PHP
PHP输出九九乘法表代码实例
Mar 27 PHP
PHP中的traits简单使用实例
May 13 PHP
php+MySql实现登录系统与输出浏览者信息功能
Jul 01 PHP
利用PHP抓取百度阅读的方法示例
Dec 18 PHP
浅谈PHP的exec()函数无返回值排查方法(必看)
Mar 31 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
Feb 23 PHP
Laravel框架集合用法实例浅析
May 14 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学习教程之第2天
2008/06/15 PHP
paypal即时到账php实现代码
2010/11/28 PHP
基于initPHP的框架介绍
2013/04/18 PHP
thinkphp判断访客为手机端或PC端的方法
2014/11/24 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
2018/05/31 PHP
js静态方法与实例方法分析
2011/07/04 Javascript
js有关元素内容操作小结
2011/12/20 Javascript
js的表单操作 简单计算器
2011/12/29 Javascript
php对mongodb的扩展(初识如故)
2012/11/11 Javascript
全面解析Bootstrap排版使用方法(标题)
2015/11/30 Javascript
AngularJS内建服务$location及其功能详解
2016/07/01 Javascript
jquery实现网页定位导航
2016/08/23 Javascript
AngularJS实现select的ng-options功能示例
2017/07/12 Javascript
JS实现点击链接切换显示隐藏内容的方法
2017/10/19 Javascript
ES6使用export和import实现模块化的方法
2018/09/10 Javascript
vue: WebStorm设置快速编译运行的方法
2018/10/18 Javascript
微信小程序实现watch监听
2020/06/04 Javascript
Vue如何将页面导出成PDF文件
2020/08/17 Javascript
python的常见命令注入威胁
2013/02/18 Python
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
2015/04/09 Python
python抓取网页中图片并保存到本地
2015/12/01 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
Python装饰器简单用法实例小结
2018/12/03 Python
python 如何调用远程接口
2020/09/11 Python
在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排
2014/01/13 面试题
花卉与景观设计系大学生求职信
2013/10/01 职场文书
主管职责范文
2013/11/09 职场文书
党组织公开承诺书
2014/03/29 职场文书
高中竞选班长演讲稿
2014/04/24 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
2014年全国爱牙日宣传活动方案
2014/09/21 职场文书
教师自荐信范文
2015/03/06 职场文书
2019广播稿怎么写
2019/04/17 职场文书
python函数指定默认值的实例讲解
2021/03/29 Python
Python使用protobuf序列化和反序列化的实现
2021/05/19 Python
十大最强奥特曼武器:怪兽战斗仪在榜,第五奥特之父只使用过一次
2022/03/18 日漫