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]

Reply via email to