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 4.2书写安全的脚本
Oct 09 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
Sep 29 PHP
PHP中将字符串转化为整数(int) intval() printf() 性能测试
Mar 20 PHP
CURL的学习和应用(附多线程实现)
Jun 03 PHP
PHP抓取、分析国内视频网站的视频信息工具类
Apr 02 PHP
php去除字符串中空字符的常用方法小结
Mar 17 PHP
一张表搞清楚php is_null、empty、isset的区别
Jul 07 PHP
php函数连续调用实例分析
Jul 30 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
Jul 13 PHP
PHP+Ajax实现的检测用户名功能简单示例
Feb 12 PHP
php-fpm中max_children的配置
Mar 15 PHP
PHP常用的类封装小结【4个工具类】
Jun 28 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
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
PHP常用开发函数解析之数组篇[未完结]
2012/07/30 PHP
Zend的AutoLoad机制介绍
2012/09/27 PHP
PHP文件操作方法汇总
2015/07/01 PHP
用php+ajax新建流程(请假、进货、出货等)
2017/06/11 PHP
PHP使用Session实现上传进度功能详解
2019/08/06 PHP
PHP调用QQ互联接口实现QQ登录网站功能示例
2019/10/24 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
jquery实现的鼠标拖动排序Li或Table
2014/05/04 Javascript
Javascript控制input输入时间格式的方法
2015/01/28 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
2015/12/02 Javascript
Angularjs在初始化未完毕时出现闪烁问题的解决方法分析
2016/08/05 Javascript
纯前端JavaScript实现Excel IO案例分享
2016/08/26 Javascript
angular-ui-sortable实现可拖拽排序列表
2016/12/28 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
2017/02/19 Javascript
Bootstrap3 模态框使用实例
2017/02/22 Javascript
NodeJS父进程与子进程资源共享原理与实现方法
2018/03/16 NodeJs
详解vue组件基础
2018/05/04 Javascript
React Native基础入门之初步使用Flexbox布局
2018/07/02 Javascript
如何在wxml中直接写js代码(wxs)
2019/11/14 Javascript
从零使用TypeScript开发项目打包发布到npm
2020/02/14 Javascript
JavaScript ES6 Class类实现原理详解
2020/05/08 Javascript
python爬虫_自动获取seebug的poc实例
2017/08/05 Python
对django中render()与render_to_response()的区别详解
2018/10/16 Python
Python学习笔记之Django创建第一个数据库模型的方法
2019/08/07 Python
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
寻找迷宫的一条出路,o通路;X:障碍
2016/07/10 面试题
公司年会晚宴演讲稿
2014/01/06 职场文书
党员2014两会学习心得体会
2014/03/17 职场文书
独生子女证明范本
2015/06/19 职场文书
react国际化react-intl的使用
2021/05/06 Javascript
Python合并多张图片成PDF
2021/06/09 Python
HTML5 语义化标签(移动端必备)
2021/08/23 HTML / CSS
Javascript 解构赋值详情
2021/11/17 Javascript
Python OpenCV形态学运算示例详解
2022/04/07 Python