php 中foreach比for快之原因

这里首先要谈到php 的hashtabletypedef struct _hashtable {
    uint nTableSize;        // hash Bucket的大小,最小为8,以2x增长。
    uint nTableMask;        // nTableSize-1 , 索引取值的优化
    uint nNumOfElements;    // hash Bucket中当前存在的元素个数,count()函数会直接返回此值
    ulong nNextFreeElement; // 下一个数字索引的位置
    Bucket *pInternalPointer;   // 当前遍历的指针(foreach比for快的原因之一)
    Bucket *pListHead;          // 存储数组头元素指针
    Bucket *pListTail;          // 存储数组尾元素指针
    Bucket **arBuckets;         // 存储hash数组
    dtor_func_t pDestructor;    // 在删除元素时执行的回调函数,用于资源的释放
    zend_bool persistent;       //指出了Bucket内存分配的方式。如果persisient为TRUE,则使用操作系统本身的内存分配函数为Bucket分配内存,否则使用PHP的内存分配函数。
    unsigned char nApplyCount; // 标记当前hash Bucket被递归访问的次数(防止多次递归)
    zend_bool bApplyProtection;// 标记当前hash桶允许不允许多次访问,不允许时,最多只能递归3次
#if ZEND_DEBUG
    int inconsistent;
#endif
} HashTable;

未完待续...
时间: 2024-10-17 18:58:01

php 中foreach比for快之原因的相关文章

在foreach循环中使用remove报ConcurrentModificationException异常原因

在foreach循环中使用remove报ConcurrentModificationException异常原因 我的代码具体是这样的 int dindex=0; int did=getInt("请输入需要删除的学生学号:"); for (Student student:list) { if(student.id==did){ list.remove(student); } } 这样会导致remove后,导致list在循环中下标和实际已经被修改后的下标不一致 我自己的解决方案是: int

HBase写入快的原因

写入: HBase写可以分为单行写和批量写: 单行写使用了void put(Put put) throws IOException方法 在创建Put对象时使用构造器: Put(byte[] row) 传入一个行键 并使用add(byte[] famliy,byte[] qualifier)方法指定列族和列名即可 然后调用HTable的put方法就可以提交了 HBase客户端提供了一个写缓冲区,可以利用void setAutoFlush(false)来激活缓冲区 如果使用了缓冲区,需要调用void

Java中forEach, 用来遍历数组

这里的for是Java中forEach, 用来遍历数组的.for(int i : d) 就是遍历int型数组d的 每一次访问数组d的时候读取的数据放入int型的i中.和for(int i=0;i<d.length();i++)是一样的,但是forEach的可用场合较多. public class e1 {public static void main(String[] args){ int[]d=new int[] {1,2,3,4,64,1234,3124,657,22}; System.ou

【js】在js中加HTML注释标签的原因?

<script type="text/JavaScript"> <!-- js代码 //--> //就是这句,为什么还要在-->前加上js注释 </script> 我们偶尔可能会看到上面这样的js注释代码,可是原因是什么呢? 答案: 原因是那些不支持 JavaScript 的浏览器会把脚本作为页面的内容来显示.为了防止这种情况发生,我们可以使用这样的 HTML 注释标签.注释行末尾的两个正斜杠是 JavaScript 的注释符号,它会阻止 Ja

在windows 2008 R2中SQl Server 2008中代理启动失败的一个原因总结

启动SQL代理的时候报错如下: 关调用实时(JIT)调试而不是此对话框的详细信息,请参见此消息的结尾. ************** 异常文本 **************System.NullReferenceException: 未将对象引用设置到对象的实例. Server stack trace: 在 Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer.ObjectExplorer.FindObjectExplore

smarty中foreach的使用

foreach.tpl <span style="font-size:18px;"><h1>内建函数foreach的使用</h1> <hr> <meta http-equiv="content-type" content="text/html;charset=utf-8"/> **********foreach的使用**********<br> <{foreach fr

LINQ中ForEach方法的使用

标签: linq 2016-06-25 12:47 409人阅读 评论(0) 收藏 举报 分类: LINQ(5) 我の原创(113) 版权声明:本文为博主原创文章,未经博主允许不得转载. LINQ中ForEach方法的使用. 1.实例一:使用ForEach获取列表中的某个字段值 [csharp] view plain copy 在CODE上查看代码片派生到我的代码片 /// <summary> /// 使用ForEach获取列表中员工名称字段 /// </summary> stat

C#中foreach实现原理

本文主要记录我在学习C#中foreach遍历原理的心得体会. 对集合中的要素进行遍历是所有编码中经常涉及到的操作,因此大部分编程语言都把此过程写进了语法中,比如C#中的foreach.经常会看到下面的遍历代码: var lstStr = new List<string> { "a", "b" }; foreach (var str in lstStr) { Console.WriteLine(str); } 实际此代码的执行过程: var lstStr

《SQL Server企业级平台管理实践》读书笔记——SQL Server中收缩数据库不好用的原因

原文:<SQL Server企业级平台管理实践>读书笔记--SQL Server中收缩数据库不好用的原因 数据库管理员有时候需要控制文件的大小,可能选择收缩文件,或者把某些数据文件情况以便从数据库里删除. 这时候我们就要使用到DBCC SHRINKFILE命令,此命令的脚本为: DBCC SHRINKFILE ( { file_name | file_id } { [ , EMPTYFILE ] | [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATE