php中strlen及count獲取字符串和數組長度的效率爲常數

php中的變量的值存儲結構體如下:
typedef union _zvalue_value {
                                      long lval;                  /* long value */    
                                      doubledval;                /* double value */    
                                      struct {
                                                  char *val;
                                                   int len;
                                               } str;
                                       HashTable *ht;              /* hash table value */
                                         zend_object_value obj;
} zvalue_value;
這裏使用聯合體而不是用結構體是出於空間利用率的考慮,因爲一個變量同時只能屬於一種類型。利用strlen獲取字符串長度時直接獲取的是int len;
數組的存儲是利用hashtable來實現的:PHP中的哈希表實現在Zend/zend_hash.c中:
typedef struct _hashtable {
    uint nTableSize;        // hash Bucket的大小,最小爲8,以2x增長。    
uint nTableMask;        // nTableSize-1 , 索引取值的優化    
uint nNumOfElements;    // hash Bucket中當前存在的元素個數,count()函數會直接返回此值
ulongnNextFreeElement; // 下一個數字索引的位置
Bucket *pInternalPointer;   // 當前遍歷的指針(foreach比for快的原因之一)
Bucket *pListHead;          // 存儲數組頭元素指針
   Bucket *pListTail;          // 存儲數組尾元素指針
Bucket **arBuckets;         // 存儲hash數組
   dtor_func_t pDestructor;    
zend_bool persistent;
   unsigned char nApplyCount; // 標記當前hash Bucket被遞歸訪問的次數(防止多次遞歸)
zend_boolbApplyProtection;// 標記當前hash桶允許不允許多次訪問,不允許時,最多隻能遞歸3次
#if ZEND_DEBUG
   int inconsistent;
#endif
} HashTable;
看到利用count是直接獲取數組的大小,不是經過循環計算的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章