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是直接獲取數組的大小,不是經過循環計算的。
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是直接獲取數組的大小,不是經過循環計算的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.