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 相关文章推荐
Classes and Objects in PHP5-面向对象编程 [1]
Oct 09 PHP
PHP获得用户使用的代理服务器ip即真实ip
Dec 31 PHP
测试您的 PHP 水平的题目
May 30 PHP
php垃圾代码优化操作代码
Aug 05 PHP
php自定义函数之递归删除文件及目录
Aug 08 PHP
PHP读取ACCESS数据到MYSQL的代码
May 11 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
Jun 28 PHP
php代码收集表单内容并写入文件的代码
Jan 29 PHP
基于PHPExcel的常用方法总结
Jun 13 PHP
php伪静态之APACHE篇
Jun 02 PHP
浅谈php7的重大新特性
Oct 23 PHP
PHP的Yii框架中过滤器相关的使用总结
Mar 29 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
改造一台复古桌面收音机
2021/03/02 无线电
php 无限级 SelectTree 类
2009/05/19 PHP
php中截取中文字符串的代码小结
2011/07/17 PHP
解析php取整的几种方式
2013/06/25 PHP
windows8.1下Apache+Php+MySQL配置步骤
2015/10/30 PHP
PHPMailer ThinkPHP实现自动发送邮件功能
2018/06/10 PHP
javascript优先加载笔记代码
2008/09/30 Javascript
iframe 父窗口和子窗口相互的调用方法集锦
2010/12/15 Javascript
JavaScript控制Session操作方法
2013/01/17 Javascript
javaScript array(数组)使用字符串作为数组下标的方法
2013/11/19 Javascript
jQuery基于ajax实现带动画效果无刷新柱状图投票代码
2015/08/10 Javascript
又一款js时钟!transform实现时钟效果
2016/08/15 Javascript
Angularjs的Controller间通信机制实例分析
2016/11/07 Javascript
如何解决jQuery EasyUI 已打开Tab重新加载问题
2016/12/19 Javascript
微信小程序 仿猫眼实现实例代码
2017/03/14 Javascript
jquery.param()实现数组或对象的序列化方法
2018/10/08 jQuery
Vue实现简单的跑马灯
2020/05/25 Javascript
vue组件中实现嵌套子组件案例
2020/08/31 Javascript
微信小程序绘制半圆(弧形)进度条
2020/11/18 Javascript
Python学习之asyncore模块用法实例教程
2014/09/29 Python
在Python中使用模块的教程
2015/04/27 Python
在Django框架中伪造捕捉到的URLconf值的方法
2015/07/18 Python
Using Django with GAE Python 后台抓取多个网站的页面全文
2016/02/17 Python
Django分页功能的实现代码详解
2019/07/29 Python
python爬虫 execjs安装配置及使用
2019/07/30 Python
Python 写入训练日志文件并控制台输出解析
2019/08/13 Python
用python介绍4种常用的单链表翻转的方法小结
2020/02/24 Python
Python Flask上下文管理机制实例解析
2020/03/16 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
2020/09/28 Python
JAKO-O德国野酷台湾站:德国首屈一指的婴幼童用品品牌
2019/01/14 全球购物
小学生运动会报道稿
2014/09/12 职场文书
办公室领导干部作风整顿个人整改措施
2014/09/17 职场文书
2014年车间主任工作总结
2014/12/10 职场文书
Python基础知识学习之类的继承
2021/05/31 Python
使用CSS实现小三角边框原理解析
2021/11/07 HTML / CSS
教你使用VS Code的MySQL扩展管理数据库的方法
2022/01/22 MySQL