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代码
Mar 03 PHP
PHP+jQuery 注册模块的改进(一):验证码存入SESSION
Oct 14 PHP
php操作xml入门之cdata区段
Jan 23 PHP
php使用unset()删除数组中某个单元(键)的方法
Feb 17 PHP
PHP中预定义的6种接口介绍
May 12 PHP
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
Oct 20 PHP
Yii2 输出xml格式数据的方法
May 03 PHP
PHP+Ajax异步带进度条上传文件实例
Nov 01 PHP
thinkPHP5.0框架应用请求生命周期分析
Mar 25 PHP
mac系统下安装多个php并自由切换的方法详解
Apr 21 PHP
laravel 字段格式化 modle 字段类型转换方法
Sep 30 PHP
PHP实现简易用户登录系统
Jul 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 str_pad() 将字符串填充成指定长度的字符串
2010/02/23 PHP
PHP文件打开、关闭、写入的判断与执行代码
2011/05/24 PHP
php array_filter除去数组中的空字符元素
2020/06/21 PHP
Chrome Web App开发小结
2014/09/04 PHP
php微信公众平台开发(三)订阅事件处理
2016/12/06 PHP
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
解决JS浮点数运算出现Bug的方法
2013/03/12 Javascript
JavaScript中数组对象的那些自带方法介绍
2013/03/12 Javascript
javascript定时变换图片实例代码
2013/03/17 Javascript
使用jQuery避免鼠标双击的解决方案
2013/08/21 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
JS中getYear()和getFullYear()区别分析
2014/07/04 Javascript
jquery调取json数据实现省市级联的方法
2015/01/29 Javascript
SpringMVC返回json数据的三种方式
2015/12/10 Javascript
JS简单实现浮动窗口效果示例
2016/09/07 Javascript
浅析Node.js:DNS模块的使用
2016/11/23 Javascript
javascript 注释代码的几种方法总结
2017/01/04 Javascript
js用类封装pop弹窗组件
2017/10/08 Javascript
jQuery-ui插件sortable实现自由拖动排序
2018/12/01 jQuery
elementUI中Table表格问题的解决方法
2018/12/04 Javascript
layui--js控制switch的切换方法
2019/09/03 Javascript
python通过BF算法实现关键词匹配的方法
2015/03/13 Python
Flask框架web开发之零基础入门
2018/12/10 Python
django认证系统实现自定义权限管理的方法
2019/08/28 Python
Python运行提示缺少模块问题解决方案
2020/04/02 Python
django实现日志按日期分割
2020/05/21 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
python使用Word2Vec进行情感分析解析
2020/07/31 Python
pycharm中使用request和Pytest进行接口测试的方法
2020/07/31 Python
Python连接mysql方法及常用参数
2020/09/01 Python
Java面试题:请说出如下代码的输出结果
2013/04/22 面试题
区三好学生主要事迹
2014/01/30 职场文书
建筑工地标语
2014/06/18 职场文书
先进工作者推荐材料
2014/12/23 职场文书
摩登时代观后感
2015/06/03 职场文书
导游词之潮音寺
2019/09/26 职场文书