php的数组和spl固定数组
php固定数组隶属于php标准库(spl)的一种数据结构。和php普通数组相比,固定数组只能用整形定义其下标,并且如名字所示,是固定长度,它的优点是比普通数组占用的内存少,而且更快速,具体原因下文会做分析,先做一个简单的测试,将10W个a放入到数组中。
static int zend_hash_do_resize(HashTable *ht){Bucket **t;#ifdef ZEND_SIGNALSTSRMLS_FETCH();#endifIS_CONSISTENT(ht);if ((ht->nTableSize << 1) > 0) {/* Let's double the table size */t = (Bucket **) perealloc_recoverable(ht->arBuckets, (ht->nTableSize << 1) * sizeof(Bucket *), ht->persistent);if (t) {HANDLE_BLOCK_INTERRUPTIONS();ht->arBuckets = t;ht->nTableSize = (ht->nTableSize << 1);ht->nTableMask = ht->nTableSize - 1;zend_hash_rehash(ht);HANDLE_UNBLOCK_INTERRUPTIONS();return SUCCESS;}return FAILURE;}return SUCCESS;}ZEND_API int zend_hash_rehash(HashTable *ht){Bucket *p;uint nIndex;IS_CONSISTENT(ht);if (UNEXPECTED(ht->nNumOfElements == 0)) {return SUCCESS;}memset(ht->arBuckets, 0, ht->nTableSize * sizeof(Bucket *));p = ht->pListHead;while (p != NULL) {nIndex = p->h & ht->nTableMask;CONNECT_TO_BUCKET_DLLIST(p, ht->arBuckets[nIndex]);ht->arBuckets[nIndex] = p;p = p->pListNext;}return SUCCESS;}
通过对比发现php普通数组的内存和时间消耗和固定数组相比大部分都用在了符号表上。php内部实现的一个重要思想是通过空间来换取时间,用hashTable能够快速定位到数据的元素,它甚至把hashTable设计成双向链表,又因为php数组空间是动态分配的,而内部是用c实现的,c语言对数组空间分配只有固定分配,为了实现让用户感觉php数组是动态分配空间的,只能通过resize和rehash实现,所以和固定数组比,相同数量的元素赋值,时间就变慢了。总之,普通数组和固定数组各有优劣,不能说固定数组时间和空间消耗低就是后,具体的情况需要考虑到具体的业务场景。