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伪造referer突破网盘禁止外连的代码
Jun 15 PHP
PHP的加密方式及原理
Jun 14 PHP
php输入流php://input使用浅析
Sep 02 PHP
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
Nov 06 PHP
php采用file_get_contents代替使用curl实例
Nov 07 PHP
PHP文件缓存类示例分享
Jan 30 PHP
THINKPHP支持YAML配置文件的设置方法
Mar 17 PHP
PHP  Yii清理缓存的实现方法
Nov 10 PHP
thinkPHP简单调用函数与类库的方法
Mar 15 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 PHP
PHP封装cURL工具类与应用示例
Jul 01 PHP
PHP解决高并发的优化方案实例
Dec 10 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类中Static方法效率测试代码
2010/10/17 PHP
Session的工作机制详解和安全性问题(PHP实例讲解)
2014/04/10 PHP
神盾加密解密教程(三)PHP 神盾解密工具
2014/06/08 PHP
ThinkPHP跳转页success及error模板实例教程
2014/07/17 PHP
php 读取输出其他文件的实现方法
2016/07/26 PHP
php创建类并调用的实例方法
2019/09/25 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
网页设计常用的一些技巧
2006/12/22 Javascript
Javascript条件判断使用小技巧总结
2008/09/08 Javascript
Js 本页面传值实现代码
2009/05/17 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
2013/10/16 Javascript
JavaScript中的undefined学习总结
2013/11/30 Javascript
JQuery悬停控制图片轮播——代码简单
2015/08/05 Javascript
js实现的光标位置工具函数示例
2016/10/03 Javascript
JS实现滑动门效果的方法详解
2016/12/19 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
layui问题之渲染数据表格时,仅出现10条数据的解决方法
2019/09/12 Javascript
基于javascript处理二进制图片流过程详解
2020/06/08 Javascript
python筛选出两个文件中重复行的方法
2018/05/31 Python
Python数据可视化实现正态分布(高斯分布)
2019/08/21 Python
python 输出列表元素实例(以空格/逗号为分隔符)
2019/12/25 Python
Python 实现opencv所使用的图片格式与 base64 转换
2020/01/09 Python
如何在python中判断变量的类型
2020/07/29 Python
Python 日期与时间转换的方法
2020/08/01 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
PyTorch预训练Bert模型的示例
2020/11/17 Python
python分布式爬虫中消息队列知识点详解
2020/11/26 Python
意大利中国电子产品购物网站:Geekmall.com
2019/09/30 全球购物
名词解释WEB SERVICE,SOAP,UDDI,WSDL,JAXP,JAXM;JSWDL开发包的介绍。
2012/10/27 面试题
自荐信结尾
2013/10/27 职场文书
委托证明的格式
2014/01/10 职场文书
动员大会主持词
2014/03/20 职场文书
战略合作协议书范本
2014/04/18 职场文书
营销团队口号
2014/06/06 职场文书
商场父亲节活动方案
2014/08/27 职场文书
Django路由层如何获取正确的url
2021/07/15 Python