com php-src: Speed up implod()'ing between 5% and 30% (by time): ext/standard/string.c

From: Date: Mon, 25 May 2015 23:12:23 +0000
Subject: com php-src: Speed up implod()'ing between 5% and 30% (by time): ext/standard/string.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-86929@lists.php.net to get a copy of this message
Commit: bb552908a05ba26c2a12cc111a4cdab6a53a4c31 Author: Bob Weinand <bobwei9@hotmail.com> Tue, 26 May 2015 01:12:23 +0200 Parents: 31f3eeb0c56eeeaf2c8bff4722cb1b6a3d2e25fc Branches: master Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=bb552908a05ba26c2a12cc111a4cdab6a53a4c31 Log: Speed up implod()'ing between 5% and 30% (by time) Significantly speed up implode()'ing on integers now... Previously I accidentally committed the first part of the patch in 69b54ba926b714dff0f8b54bea385e9a278c5849 Changed paths: M ext/standard/string.c Diff: diff --git a/ext/standard/string.c b/ext/standard/string.c index d3d8848..7dad1b6 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -1218,12 +1218,18 @@ PHPAPI void php_implode(const zend_string *delim, zval *arr, zval *return_value) } ZEND_HASH_FOREACH_END(); } - strings = emalloc(sizeof(zend_string *) * numelems); + strings = emalloc((sizeof(zend_long) + sizeof(zend_string *)) * numelems); strptr = strings - 1; ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(arr), tmp) { - *++strptr = zval_get_string(tmp); - len += (*strptr)->len; + if (Z_TYPE_P(tmp) == IS_LONG) { + *++strptr = NULL; + ((zend_long *) (strings + numelems))[strptr - strings] = Z_LVAL_P(tmp); + len += (int) log10(Z_LVAL_P(tmp) < 0 ? -100 * ((double) Z_LVAL_P(tmp) - 0.001) : 10 * ((double) Z_LVAL_P(tmp) + 0.01)); + } else { + *++strptr = zval_get_string(tmp); + len += (*strptr)->len; + } } ZEND_HASH_FOREACH_END(); str = zend_string_alloc(len + (numelems - 1) * delim->len, 0); @@ -1231,15 +1237,31 @@ PHPAPI void php_implode(const zend_string *delim, zval *arr, zval *return_value) *cptr = 0; do { - cptr -= (*strptr)->len; - memcpy(cptr, (*strptr)->val, (*strptr)->len); - zend_string_release(*strptr); + if (*strptr) { + cptr -= (*strptr)->len; + memcpy(cptr, (*strptr)->val, (*strptr)->len); + zend_string_release(*strptr); + } else { + char *oldPtr = cptr; + char oldVal = *cptr; + zend_long val = ((zend_long *) (strings + numelems))[strptr - strings]; + cptr = zend_print_long_to_buf(cptr, val); + *oldPtr = oldVal; + } cptr -= delim->len; memcpy(cptr, delim->val, delim->len); } while (--strptr > strings); - memcpy(str->val, (*strptr)->val, (*strptr)->len); - zend_string_release(*strptr); + + if (*strptr) { + memcpy(str->val, (*strptr)->val, (*strptr)->len); + zend_string_release(*strptr); + } else { + char *oldPtr = cptr; + char oldVal = *cptr; + zend_print_long_to_buf(cptr, ((zend_long *) (strings + numelems))[strptr - strings]); + *oldPtr = oldVal; + } efree(strings); RETURN_NEW_STR(str);

« previous php.cvs (#86929) next »