mirror of
https://github.com/php/php-src.git
synced 2025-08-15 13:38:49 +02:00
Use more compact representation for packed arrays.
- for packed arrays we store just an array of zvals without keys. - the elements of packed array are accessible throuf as ht->arPacked[i] instead of ht->arData[i] - in addition to general ZEND_HASH_FOREACH_* macros, we introduced similar familied for packed (ZEND_HASH_PACKED_FORECH_*) and real hashes (ZEND_HASH_MAP_FOREACH_*) - introduced an additional family of macros to access elements of array (packed or real hashes) ZEND_ARRAY_ELEMET_SIZE, ZEND_ARRAY_ELEMET_EX, ZEND_ARRAY_ELEMET, ZEND_ARRAY_NEXT_ELEMENT, ZEND_ARRAY_PREV_ELEMENT - zend_hash_minmax() prototype was changed to compare only values Because of smaller data set, this patch may show performance improvement on some apps and benchmarks that use packed arrays. (~1% on PHP-Parser) TODO: - sapi/phpdbg needs special support for packed arrays (WATCH_ON_BUCKET). - zend_hash_sort_ex() may require converting packed arrays to hash.
This commit is contained in:
parent
0eb603e3bb
commit
90b7bde615
89 changed files with 3302 additions and 1664 deletions
|
@ -72,7 +72,7 @@ static void zend_weakref_unref(zend_ulong obj_addr, void *tagged_ptr) {
|
|||
uintptr_t tag = ZEND_WEAKREF_GET_TAG(tagged_ptr);
|
||||
if (tag == ZEND_WEAKREF_TAG_HT) {
|
||||
HashTable *ht = ptr;
|
||||
ZEND_HASH_FOREACH_PTR(ht, tagged_ptr) {
|
||||
ZEND_HASH_MAP_FOREACH_PTR(ht, tagged_ptr) {
|
||||
zend_weakref_unref_single(
|
||||
ZEND_WEAKREF_GET_PTR(tagged_ptr), ZEND_WEAKREF_GET_TAG(tagged_ptr), obj_addr);
|
||||
} ZEND_HASH_FOREACH_END();
|
||||
|
@ -209,7 +209,7 @@ found_weakref:
|
|||
}
|
||||
|
||||
if (tag == ZEND_WEAKREF_TAG_HT) {
|
||||
ZEND_HASH_FOREACH_PTR(ptr, tagged_ptr) {
|
||||
ZEND_HASH_MAP_FOREACH_PTR(ptr, tagged_ptr) {
|
||||
if (ZEND_WEAKREF_GET_TAG(tagged_ptr) == ZEND_WEAKREF_TAG_REF) {
|
||||
ptr = ZEND_WEAKREF_GET_PTR(tagged_ptr);
|
||||
goto found_weakref;
|
||||
|
@ -290,7 +290,7 @@ static void zend_weakmap_free_obj(zend_object *object)
|
|||
{
|
||||
zend_weakmap *wm = zend_weakmap_from(object);
|
||||
zend_ulong obj_addr;
|
||||
ZEND_HASH_FOREACH_NUM_KEY(&wm->ht, obj_addr) {
|
||||
ZEND_HASH_MAP_FOREACH_NUM_KEY(&wm->ht, obj_addr) {
|
||||
zend_weakref_unregister(
|
||||
(zend_object *) obj_addr, ZEND_WEAKREF_ENCODE(&wm->ht, ZEND_WEAKREF_TAG_MAP));
|
||||
} ZEND_HASH_FOREACH_END();
|
||||
|
@ -412,7 +412,7 @@ static HashTable *zend_weakmap_get_properties_for(zend_object *object, zend_prop
|
|||
|
||||
zend_ulong obj_addr;
|
||||
zval *val;
|
||||
ZEND_HASH_FOREACH_NUM_KEY_VAL(&wm->ht, obj_addr, val) {
|
||||
ZEND_HASH_MAP_FOREACH_NUM_KEY_VAL(&wm->ht, obj_addr, val) {
|
||||
zend_object *obj = (zend_object*)obj_addr;
|
||||
zval pair;
|
||||
array_init(&pair);
|
||||
|
@ -433,7 +433,7 @@ static HashTable *zend_weakmap_get_gc(zend_object *object, zval **table, int *n)
|
|||
zend_weakmap *wm = zend_weakmap_from(object);
|
||||
zend_get_gc_buffer *gc_buffer = zend_get_gc_buffer_create();
|
||||
zval *val;
|
||||
ZEND_HASH_FOREACH_VAL(&wm->ht, val) {
|
||||
ZEND_HASH_MAP_FOREACH_VAL(&wm->ht, val) {
|
||||
zend_get_gc_buffer_add_zval(gc_buffer, val);
|
||||
} ZEND_HASH_FOREACH_END();
|
||||
zend_get_gc_buffer_use(gc_buffer, table, n);
|
||||
|
@ -449,7 +449,7 @@ static zend_object *zend_weakmap_clone_obj(zend_object *old_object)
|
|||
|
||||
zend_ulong obj_addr;
|
||||
zval *val;
|
||||
ZEND_HASH_FOREACH_NUM_KEY_VAL(&new_wm->ht, obj_addr, val) {
|
||||
ZEND_HASH_MAP_FOREACH_NUM_KEY_VAL(&new_wm->ht, obj_addr, val) {
|
||||
zend_weakref_register(
|
||||
(zend_object *) obj_addr, ZEND_WEAKREF_ENCODE(new_wm, ZEND_WEAKREF_TAG_MAP));
|
||||
zval_add_ref(val);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue