Re: Apply substr() optimization to array_slice()
| From: | Dennis Birkholz | Date: | Fri, 27 Oct 2017 14:13:54 +0000 |
| Subject: | Re: Apply substr() optimization to array_slice() | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-100967@lists.php.net to get a copy of this message | ||
Hello Benjamin,
Am 27.10.2017 um 14:12 schrieb Benjamin Coutu:
> Hello everyone,
>
> Please consider these two statements:
>
> substr($string, 0, $length);
> array_slice($array, 0, $length, true);
>
> Currently, with substr(), if $offset is zero and $length is smaller or equal to the original
> string length we just increase the reference count of the original string and return it via
> RETURN_STR_COPY.
> In that case we completely save the allocation of a new string.
the optimization actually only returns the same string if the supplied
length is the length of the string, see:
https://lxr.room11.org/xref/php-src%40master/ext/standard/string.c#2436
> Now, array_slice() could be optimized similarly, but currently (unless the resulting array is
> expected to be empty) we always create a new array no matter if we actually have to.
> The same mechanism as used with substr() could be applied to array_slice(), given that $offset
> is zero and of course only if $preserve_keys is true.
>
> A patch would look like this:
>
> if (length <= num_in && offset == 0 && preserve_keys) {
> /* Copy the original array */
> ZVAL_COPY(return_value, input);
> return;
> }
So the array_slice optimization should only do the some, otherwise the
returned array would be longer than desired.
Greets,
Dennis