Re: [PATCH] More array filling optimizations

From: Date: Fri, 25 Apr 2008 14:24:27 +0000
Subject: Re: [PATCH] More array filling optimizations
References: 1  Groups: php.internals 
Request: Send a blank email to internals+get-37216@lists.php.net to get a copy of this message
Hi, Matt Wilmas wrote:
Hi all, Expanding on the idea of passing a size other than 0 to zend_hash_init(), when possible, which was done awhile ago in a few areas (to save resize/rehash operations), I finally added an "array_init_size()" that can be used instead of array_init(), likewise, when a size is known. As an example to start, I updated these functions: array_*: change_key_case, chunk, combine, fill, fill_keys, flip, keys (without $search_value), map, rand, reverse, slice, splice, unique (since it copies all entries first), values; and also compact; func_get_args; get_defined_vars; str_split; and a couple internal uses.
heh, this optimisitations was one of the pluses mysqlnd had over mysqli/libmysql. I am using the following macro: #if PHP_MAJOR_VERSION < 6 #define mysqlnd_array_init(arg, field_count) \ { \ ALLOC_HASHTABLE_REL(Z_ARRVAL_P(arg));\ zend_hash_init(Z_ARRVAL_P(arg), (field_count), NULL, ZVAL_PTR_DTOR, 0); \ Z_TYPE_P(arg) = IS_ARRAY;\ } #else #define mysqlnd_array_init(arg, field_count) \ { \ ALLOC_HASHTABLE_REL(Z_ARRVAL_P(arg));\ zend_u_hash_init(Z_ARRVAL_P(arg), (field_count), NULL, ZVAL_PTR_DTOR, 0, 0);\ Z_TYPE_P(arg) = IS_ARRAY;\ } #endif
Those were the simplest, most obvious cases I found. :-) I didn't test every function, but for example, the array functions that don't do much work I found to be ~10% faster (with more than 8 elements, otherwise no resizing would be needed). If these changes are applied, more can be done where possible, by others, or I can and send further patches, or update them myself if I have CVS access... http://realplain.com/php/array_init_size.diff http://realplain.com/php/array_init_size_5_3.diff I was playing with initializing scripts' array( ... ) constructs with the correct size too, but wasn't sure about the changes or what the opinion would be. Runtime creation is improved with >8 elements, though it adds a bit of compile overhead. Anyway, separate patches for that: http://realplain.com/php/array_init_size_vm.diff http://realplain.com/php/array_init_size_vm_5_3.diff Thanks, Matt


« previous php.internals (#37216) next »