hi -
this litte patch makes zend_hash_copy around 10% faster by
taking a "shortcut"
zeev, andi -
is this "commitable" or do you have any objections?
tc
Index: zend_hash.c
===================================================================
RCS file: /repository/Zend/zend_hash.c,v
retrieving revision 1.81
diff -u -r1.81 zend_hash.c
--- zend_hash.c 2001/10/04 12:47:59 1.81
+++ zend_hash.c 2001/11/25 16:22:22
@@ -754,23 +754,77 @@
ZEND_API void zend_hash_copy(HashTable *target, HashTable *source, copy_ctor_func_t
pCopyConstructor, void *tmp, uint size)
{
Bucket *p;
+ Bucket *np;
void *new_entry;
+ uint nIndex;
IS_CONSISTENT(source);
IS_CONSISTENT(target);
- p = source->pListHead;
- while (p) {
- if (p->nKeyLength) {
- zend_hash_update(target, p->arKey, p->nKeyLength, p->pData,
size, &new_entry);
- } else {
- zend_hash_index_update(target, p->h, p->pData, size,
&new_entry);
+ if (target->nNumOfElements == 0) {
+ target->nTableSize = source->nTableSize;
+ target->nTableMask = source->nTableMask;
+ target->nNumOfElements = source->nNumOfElements;
+ target->nNextFreeElement = source->nNextFreeElement;
+
+ pefree(target->arBuckets, target->persistent);
+ target->arBuckets = (Bucket **) pecalloc(target->nTableSize,
+sizeof(Bucket *), target->persistent);
+
+ p = source->pListHead;
+ while (p) {
+ if (p->nKeyLength) {
+ np = (Bucket *)
+pemalloc(sizeof(Bucket)-1+p->nKeyLength, target->persistent);
+ memcpy(np->arKey, p->arKey, p->nKeyLength);
+ np->nKeyLength = p->nKeyLength;
+ } else {
+ np = (Bucket *)
+pemalloc(sizeof(Bucket)-1+p->nKeyLength, target->persistent);
+ np->nKeyLength = 0;
+ }
+
+ np->h = p->h;
+
+ if (size == sizeof(void*)) {
+ memcpy(&(np)->pDataPtr, p->pData, sizeof(void *));
+ np->pData = &np->pDataPtr;
+ } else {
+ np->pData = (void *) pemalloc(size,
+target->persistent);
+ /* XXX exit?
+ if (!(p)->pData) {
+ pefree(p, (ht)->persistent);
+ return FAILURE;
+ }
+ */
+ memcpy(np->pData, p->pData, size);
+ np->pDataPtr=NULL;
+ }
+
+ nIndex = p->h & target->nTableMask;
+ CONNECT_TO_BUCKET_DLLIST(np, target->arBuckets[nIndex]);
+ target->arBuckets[nIndex] = np;
+
+ CONNECT_TO_GLOBAL_DLLIST(np, target);
+
+ if (pCopyConstructor) {
+ pCopyConstructor(np->pData);
+ }
+
+ p = p->pListNext;
}
- if (pCopyConstructor) {
- pCopyConstructor(new_entry);
- }
- p = p->pListNext;
+ } else {
+ p = source->pListHead;
+ while (p) {
+ if (p->nKeyLength) {
+ zend_hash_update(target, p->arKey, p->nKeyLength,
+p->pData, size, &new_entry);
+ } else {
+ zend_hash_index_update(target, p->h, p->pData, size,
+&new_entry);
+ }
+ if (pCopyConstructor) {
+ pCopyConstructor(new_entry);
+ }
+ p = p->pListNext;
+ }
}
+
target->pInternalPointer = target->pListHead;
}
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]