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中实现Javascript的escape()函数代码
Aug 08 PHP
PHP数组传递是值传递而非引用传递概念纠正
Jan 31 PHP
php获取表单中多个同名input元素的值
Mar 20 PHP
JS异常处理try..catch语句的作用和实例
May 05 PHP
ThinkPHP 3.2 数据分页代码分享
Oct 14 PHP
Thinkphp中的curd应用实用要点
Jan 04 PHP
PHP中的替代语法介绍
Jan 09 PHP
PHP全局变量与超级全局变量区别分析
Apr 01 PHP
Yii+MYSQL锁表防止并发情况下重复数据的方法
Jul 14 PHP
验证坐标在某坐标区域内php代码
Oct 08 PHP
PHP中in_array的隐式转换的解决方法
Mar 06 PHP
php5对象复制、clone、浅复制与深复制实例详解
Aug 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
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
2006/12/06 PHP
php+mysql开源XNA 聚合程序发布 下载
2007/07/13 PHP
php 无限级 SelectTree 类
2009/05/19 PHP
sphinx增量索引的一个问题
2011/06/14 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
详解PHP实现异步调用的4种方法
2016/03/14 PHP
PHP Laravel 上传图片、文件等类封装
2017/08/16 PHP
javascript面向对象之Javascript 继承
2010/05/04 Javascript
JavaScript的removeChild()函数用法详解
2015/12/27 Javascript
浅谈JS使用[ ]来访问对象属性
2016/09/21 Javascript
js实现点击图片自动提交action的简单方法
2016/10/16 Javascript
js提示框替代系统alert,自动关闭alert对话框的实现方法
2016/11/07 Javascript
BootStrapValidator初使用教程详解
2017/02/10 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
2018/05/29 Javascript
详解vuex之store拆分即多模块状态管理(modules)篇
2018/11/13 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
2019/01/18 Javascript
写一个Vue Popup组件
2019/02/25 Javascript
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
基于Python socket的端口扫描程序实例代码
2018/02/09 Python
Python 做曲线拟合和求积分的方法
2018/12/29 Python
详解用python写网络爬虫-爬取新浪微博评论
2019/05/10 Python
python itchat实现调用微信接口的第三方模块方法
2019/06/11 Python
深入浅析Python 中的sklearn模型选择
2019/10/12 Python
浅谈Tensorflow 动态双向RNN的输出问题
2020/01/20 Python
在tensorflow中设置保存checkpoint的最大数量实例
2020/01/21 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
Django Admin 上传文件到七牛云的示例代码
2020/06/20 Python
芬兰灯具网上商店:Nettilamppu.fi
2018/06/30 全球购物
捷克鲜花配送:Florea.cz
2018/10/29 全球购物
小学教师寄语大全
2014/04/03 职场文书
细节决定成败演讲稿
2014/05/12 职场文书
法院授权委托书范文
2014/08/02 职场文书
四风查摆问题及整改措施
2014/10/10 职场文书
镇党政领导班子民主生活会思想汇报
2014/10/11 职场文书
英语导游欢迎词
2015/09/30 职场文书
《确定位置》教学反思
2016/02/18 职场文书