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 相关文章推荐
ThinkPHP中实例Model方法的区别说明
Aug 21 PHP
PHP获取文件后缀名的三个函数
Oct 15 PHP
php操作csv文件代码实例汇总
Sep 22 PHP
php中的字符编码转换函数用法示例
Oct 20 PHP
新浪SAE搭建PHP项目教程
Jan 28 PHP
PHP实现C#山寨ArrayList的方法
Jul 16 PHP
CodeIgniter表单验证方法实例详解
Mar 03 PHP
php微信开发之上传临时素材
Jun 24 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
thinkPHP中钩子的使用方法实例分析
Nov 16 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
Apr 20 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
Oct 11 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网页游戏学习之Xnova(ogame)源码解读(一)
2014/06/23 PHP
PHP中读取文件的8种方法和代码实例
2014/08/05 PHP
php通过隐藏表单控件获取到前两个页面的url
2014/09/09 PHP
PHP中使用xmlreader读取xml数据示例
2014/12/29 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
文本框的字数限制功能jquery插件
2009/11/24 Javascript
jQuery实现的仿select功能代码
2015/08/19 Javascript
浅谈JavaScript中的对象及Promise对象的实现
2015/11/15 Javascript
jQuery 3.0中存在问题及解决办法
2016/07/15 Javascript
AngularJS extend用法详解及实例代码
2016/11/15 Javascript
jquery 仿锚点跳转到页面指定位置的实例
2017/02/14 Javascript
AngularJS实现表单元素值绑定操作示例
2017/10/11 Javascript
通过fastclick源码分析彻底解决tap“点透”
2017/12/24 Javascript
React如何解决fetch跨域请求时session失效问题
2018/11/02 Javascript
vue-cli3 DllPlugin 提取公用库的方法
2019/04/24 Javascript
vue cli3.0 引入eslint 结合vscode使用
2019/05/27 Javascript
详解Vue之计算属性
2020/06/20 Javascript
[01:12:44]VG vs Mineski Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
python sqlobject(mysql)中文乱码解决方法
2008/11/14 Python
跟老齐学Python之大话题小函数(2)
2014/10/10 Python
Python的条件表达式和lambda表达式实例
2019/01/31 Python
python字符串切割:str.split()与re.split()的对比分析
2019/07/16 Python
详细介绍Python进度条tqdm的使用
2019/07/31 Python
Python应用自动化部署工具Fabric原理及使用解析
2020/11/30 Python
美国Curacao百货连锁店网站:iCuracao.com
2019/07/20 全球购物
网络技术专业推荐信
2014/02/20 职场文书
高中生操行评语
2014/04/25 职场文书
不遵守课堂纪律的检讨书
2014/09/24 职场文书
热情服务标语
2014/10/07 职场文书
上班迟到检讨书范文300字
2014/11/02 职场文书
2014年党风建设工作总结
2014/11/19 职场文书
2014年妇幼卫生工作总结
2014/12/09 职场文书
会议简报格式范文
2015/07/20 职场文书
新郎父母婚礼致辞
2015/07/27 职场文书
2016年学校党支部公开承诺书
2016/03/25 职场文书
Python软件包安装的三种常见方法
2022/07/07 Python