源码分析foreach效率比for循环高

2017-01-13 10:53:51来源:csdn作者:w15249243295人点击


首先看看php源码变量值存储:


typedef union _zvalue_value {
long lval;/* long value */
double dval;/* double value */
struct {
char *val;
int len;
} str;
HashTable *ht;/* hash table value */
zend_object_value obj;
} zvalue_value;php数组的值存储在zvalue_value.ht里面,它是一个HashTable。HashTable的特点:


键(key):用于操作数据的标示,例如PHP数组中的索引,或者字符串键等等。槽(slot/bucket):哈希表中用于保存数据的一个单元,也就是数据真正存放的容器。哈希函数(hash function):将key映射(map)到数据应该存放的slot所在位置的函数。哈希冲突(hash collision):哈希函数将两个不同的key映射到同一个索引的情况。

所以$array['key']这样子获取数据,就会需要做一次hash才会知道bucket的位置,才能拿到值。


typedef struct _Bucket
{
char *key;
void *value;
struct _Bucket *next;
} Bucket;typedef struct _HashTable
{
int size;
int elem_num;
Bucket** buckets;
} HashTable;



HashTable的数据结构,通过这段源码可以看出来,如果是foreach的话,可以直接通过Bucket.next获取到下一个值,而如果是for循环则需要做一次hash才能知道Bucket的地址,所以foreach比for循环效率更高一些。

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台