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))。这些技巧产生的速度差异在小项目里可能并不明显,但是在类似框架这样的大项目中,一次请求动辄便会涉及到几 
百几千几万次数组循环操作,差异就会明显放大。

转载:https://www.jb51.net/article/20415.htm

转载于:https://www.cnblogs.com/jimz/p/9346664.html

php foreach、while性能比较相关推荐

  1. 面试官:有了 for 循环 为什么还要 forEach ?

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:juejin.cn/post/7018097650687803422 本质区别 for循环和forEach的语法区别 for循 ...

  2. 记一次接口性能优化实践总结:优化接口性能的八个建议

    前言 最近对外接口偶现504超时问题,原因是代码执行时间过长,超过nginx配置的15秒,然后真枪实弹搞了一次接口性能优化.在这里结合优化过程,总结了接口优化的八个要点,希望对大家有帮助呀~ 数据量比 ...

  3. java for foreach 效率_Java中LinkedList的fori和foreach效率比较

    在<Java中ArrayList的fori和foreach效率比较>中对ArrayList的两种循环方式进行了比较,本次对LinkedList的两种遍历方式进行效率的比较. 1. list ...

  4. js for foreach 快慢_js基本搜索算法实现与170万条数据下的性能测试

    前言 今天让我们来继续聊一聊js算法,通过接下来的讲解,我们可以了解到搜索算法的基本实现以及各种实现方法的性能,进而发现for循环,forEach,While的性能差异,我们还会了解到如何通过web ...

  5. Java 8 Iterable.forEach()与foreach循环

    本文翻译自:Java 8 Iterable.forEach() vs foreach loop Which of the following is better practice in Java 8? ...

  6. 面试官:有了for循环 为什么还要forEach?

    面试官:有了for循环 为什么还要forEach? js中那么多循环,for for-in for-of forEach,有些循环感觉上是大同小异今天我们讨论下for循环和forEach的差异.我们从 ...

  7. js的 for forEach

    考虑到代码少简洁,我常常用forEach,在我的猜想里我觉得forEach要耗性能.今天查看了这方面的知识,以后还是多用for少用forEach(如果for能做到的话), for 循环没有任何额外的函 ...

  8. 有了for循环 为什么还要forEach?

    js中那么多循环,for for-in for-of forEach,有些循环感觉上是大同小异今天我们讨论下for循环和forEach的差异. 我们从几个维度展开讨论: for循环和forEach的本 ...

  9. java script 遍历数组_JavaScript中数组中遍历的方法

    前言 最近看了好几篇总结数组中遍历方法的文章,然而"纸上得来终觉浅",决定此事自己干.于是小小总结,算是自己练手了. 各种数组遍历方法 数组中常用的遍历方法有四种,分别是: for ...

  10. alxctools索引超出了数组界限_[译]V8中的数组类型

    译者:蒋海涛 JavaScript 对象可以和任何属性有关联.对象属性的名称可以包含任何字符.有趣的是 JavaScript 引擎可以选择名称为纯数字的属性来进行优化,而这个属性其实就是数组 inde ...

最新文章

  1. 啥不懂也能动手搭建属于自己的博客网站
  2. ECSHOP 商品分类树显示商品总数的方法
  3. python基础学习中要懂的知识点:反射机制
  4. 利用 squid 反向代理提高网站性能
  5. oracle11g ora 12545,sqlplus本地登录报错ORA-12545
  6. 【原创】关于ASP.NET WebForm与ASP.NET MVC的比较
  7. ABP入门系列(17)——使用ABP集成的邮件系统发送邮件
  8. 阿里云SLB上http强制跳转到https问题处理
  9. 淘宝京东设计师来看,电商Banner设计策略!
  10. keil5中如何实时查看变量值
  11. SQL查询语句-返回名称的分类
  12. 统计计算函数练pandas
  13. 三星S7edge番茄花园ROM
  14. Python之 函数笔记
  15. 开源中国 Android 文件夹管理
  16. 10个Spring Boot 优秀学习项目
  17. 给旧安卓手机安卓linux系统,手机秒变服务器(Linux Deploy)
  18. jquery 延迟执行
  19. 验证tomcat安装成功
  20. MATLAB机器人寻找轨迹路线规划源代码

热门文章

  1. 用oracle的sqlload导入文件到数据库
  2. android自定义滤镜,让IjkPlayer支持插入自定义的GPU滤镜方法
  3. ubuntu下使用screen用不关闭
  4. SSD源码解读之ssd_pascal.py
  5. 剑指Offer——Python答案
  6. SQLServer数据库写操作报错String or binary data would be truncated问题解决
  7. OpenCV笔记:pyrDown()函数和pryUp()函数的使用
  8. AttributeError: ‘_IncompatibleKeys‘ object has no attribute ‘cuda‘
  9. oracle10gdmp字符集,从Export DMP文件看导出字符集(上)
  10. Dialog里加入下拉框Java_android 自定义dialog弹出框,带单选多选下拉