From: Dmitry Stogov Date: Thu, 16 Oct 2014 15:19:10 +0000 (+0400) Subject: Micro optimization for zend_hash_next_index_insert_new() X-Git-Tag: PRE_NATIVE_TLS_MERGE~104^2~10^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2a1250fa5738d97a215af8b939318013f8ebf926;p=php Micro optimization for zend_hash_next_index_insert_new() --- diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 6304737f04..dfd63aa7e1 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -444,11 +444,15 @@ static zend_always_inline zval *_zend_hash_index_add_or_update_i(HashTable *ht, HANDLE_BLOCK_INTERRUPTIONS(); /* incremental initialization of empty Buckets */ - if (h >= ht->nNumUsed) { - Bucket *q = ht->arData + ht->nNumUsed; - while (q != p) { - ZVAL_UNDEF(&q->val); - q++; + if ((flag & (HASH_ADD_NEW|HASH_ADD_NEXT)) == (HASH_ADD_NEW|HASH_ADD_NEXT)) { + ht->nNumUsed = h + 1; + } else if (h >= ht->nNumUsed) { + if (h > ht->nNumUsed) { + Bucket *q = ht->arData + ht->nNumUsed; + while (q != p) { + ZVAL_UNDEF(&q->val); + q++; + } } ht->nNumUsed = h + 1; } @@ -537,12 +541,12 @@ ZEND_API zval *_zend_hash_index_update(HashTable *ht, zend_ulong h, zval *pData ZEND_API zval *_zend_hash_next_index_insert(HashTable *ht, zval *pData ZEND_FILE_LINE_DC) { - return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD ZEND_FILE_LINE_RELAY_CC); + return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD | HASH_ADD_NEXT ZEND_FILE_LINE_RELAY_CC); } ZEND_API zval *_zend_hash_next_index_insert_new(HashTable *ht, zval *pData ZEND_FILE_LINE_DC) { - return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD | HASH_ADD_NEW ZEND_FILE_LINE_RELAY_CC); + return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD | HASH_ADD_NEW | HASH_ADD_NEXT ZEND_FILE_LINE_RELAY_CC); } static void zend_hash_do_resize(HashTable *ht) diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index 5a36ddf28f..2b9beca0fc 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -32,6 +32,7 @@ #define HASH_ADD (1<<1) #define HASH_UPDATE_INDIRECT (1<<2) #define HASH_ADD_NEW (1<<3) +#define HASH_ADD_NEXT (1<<4) #define INVALID_IDX ((uint32_t) -1)