php foreach、while性能比较

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

时间: 2024-07-31 16:58:18

php foreach、while性能比较的相关文章

AutoCAD .net 开发 SelectionFilter Foreach Linq 性能比较

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Diagnostics; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.ApplicationS

Unity3D系列1 : foreach对于性能到底有没有影响

0x00 序言 本文无意比较for和foreach谁效率更高,不会设计到for和foreach取值之类的等等.单纯探讨foreach会不会影响unity3d效率. 事情开端是这样的,之前在看unity优化的时候,遇见了这么一句: 尽量不要使用foreach,而是使用for.foreach其实会涉及到迭代器的使用,而据传说每一次循环所产生的迭代器会带来24 Bytes的垃圾.那么循环10次就是240Bytes. 由于刚接触unity以及c#不久,当时没有仔细研究内在原理,只是简单相信了这个说法.于

Plinq-Parallel.ForEach for 性能提升

https://msdn.microsoft.com/zh-cn/library/dd460720.aspx 本示例显示如何使用 Parallel.ForEach 循环对任何 System.Collections.IEnumerable 或 System.Collections.Generic.IEnumerable<T> 数据源启用数据并行. 注意 本文档使用 lambda 表达式在 PLINQ 中定义委托.  如果您不熟悉 C# 或 Visual Basic 中的 lambda 表达式,请

我的架构经验系列文章 - 后端架构 - 性能层面

性能层面: 性能分析 我觉得性能分析的话要注意几个要点: 不要去猜:对于自己写的代码你是否知道你的代码要执行多久,是不是还在用时间相减来测试代码执行时间?现在有很多自动化的工具可以在程序运行的时候,测试代码中每一句语句的执行时间,可以有效分析出代码的性能瓶颈.对于比较重要的业务逻辑建议采用类似的工具来进行性能分析,有的时候性能慢的代码不一定是自己写的还可能是框架内提供的,如果没有一个丰富的编码经验是不太可能知道这些点的,但是通过这样的分析工具你就能知道这个地方会慢,虽然框架的代码我们不能改,但是

Effective C# Chapter1-Language Elements

<EffectiveC#>这本书讲了一些关于C#语言的使用技巧和经验. 该系列文章是备忘录和自己的一些见解.程序猿们最喜欢这类问题了,欢迎讨论~ 菜单 Item 1 使用属性取代公共成员变量 Item 2 优先考虑readonly而不是const Item 3 使用is/as取代转换操作符来进行对象类型转换 Item 4 使用ConditionalAttribute 取代 #if Item 5 总是提供ToString()方法 Item 6 理解Value Types 和 Referance

Collections你用对了吗?

.Net有两类基础的集合类型:List和Dictionary.List是基于Index的,Dictionary是基于key的.集合类型一般实现了IEnumberable,ICollection或者Ilist 接口. 类型 描写叙述 使用场景 ArrayList 可以依据加入项动态调整集合大小. 适用于存储自己定义类型,特别是对于数据常常进行添加和删除的. 使用TrimToSize()去掉预留元素位置,优化性能. 使用ArrayList.BinarySearch进行高效的查询. 不要用ArrayL

高性能JS笔记4——算法和流程控制

一.循环 for.while.do while三种循环的性能都没有多大区别.foreach 的性能较其他三种差 . 既然循环没有多大区别,注意循环内的代码控制. 减少迭代次数. 减少迭代工作量. 推荐写法: for(int i=0, l = array.length; i < l; i++) { int v = array[i]; }; 二.条件语句 if else 和 switch语句较少时,if else较易读.分支多时,从性能或易读上都倾向于switch. 优化条件语句: 最小化到达正确分

java核心数据结构总结

JDK提供了一组主要的数据结构的实现,如List.Set.Map等常用结构,这些结构都继承自java.util.collection接口. List接口 List有三种不同的实现,ArrayList和Vector使用数组实现,其封装了对内部数组的操作.LinkedList使用了循环双向链表的数据结构,LinkedList链表是由一系列的链表项连接而成,一个链表项包括三部分:链表内容.前驱表项和后驱表项. LinkedList的表项结构如图: LinkedList表项间的连接关系如图: 可以看出,

JavaScript面试题总结系列(三)

3. JavaScript数组 3.1 数组常用方法 map: 遍历数组,返回回调函数返回值组成的新数组,不改变原数组 forEach:无法break,可以用try/catch中throw new Error来停止 filter:过滤 some:有一项返回true,则整体为true every:有一项返回false,则整体为false join:通过指定连接符生成字符串 push / pop:末尾推入和弹出,改变原数组, 返回推入/弹出项 unshift / shift:头部推入和弹出,改变原数

php中的for 和foreach性能对比

总体来说,如果数据库过几十万了,才能看出来快一点还是慢一点,如果低于10万的循环,就不用测试了,两者性差异不明显.但是我还是推荐用foreach.循环数字数组时,for需要事先count($arr)计算数组长度,需要引入自增变量$i,每次循环都要进行条件判断$i<$c,然后自增$i++,输出数组元素时,$arr[$i]需要进行哈希操作. 而foreach循环数组时,指针会自动指向下一个元素,不需要计算数组长度,没有条件判断和自增变量,调用元素时也没有哈希操作,所以性能肯定要比for和while高