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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w15249243295/article/details/52596885

首先看看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循环效率更高一些。


猜你喜欢

转载自blog.csdn.net/w15249243295/article/details/52596885