Re: array_values should be a no-op for packed layout arrays
| From: | Julien Pauli | Date: | Tue, 14 Mar 2017 16:21:57 +0000 |
| Subject: | Re: array_values should be a no-op for packed layout arrays | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-98519@lists.php.net to get a copy of this message | ||
On Mon, Mar 13, 2017 at 6:34 AM, Jesse Schalken <me@jesseschalken.com>
wrote:
> I noticed this commit
> <https://github.com/facebook/hhvm/commit/4167d66fcfa81a1c2a1
> 9e853282fac968d9cd454>
> recently in HHVM, which makes array_values() return the same array back if
> it's packed instead of building a copy.
>
> My understanding is PHP 7 also has packed arrays like HHVM, and my reading
> of PHP's array_values() implementation (here
> <https://github.com/php/php-src/blob/c6982995504b6e21e8a5ade
> 29cfb16a55196dc43/ext/standard/array.c#L4000>)
> is that it always creates a copy of the array, even if it's packed.
>
> Would this be a worthwhile optimisation to make in PHP as well?
>
That would be nice if array_values() wouldn't reindex the array.
But it does.
$a = [12=> 'foo', 42 => 'bar']; // packed array
$b = array_values($a);
$b // [0 => 'foo', 42 => 'bar']; // keys have been changed and are not
kept from source
So, array_values() must allocate a new array, and fill it in with the
values of source, because array_values() reindexes the source array from
key 0 ; whatever was the original array.
Note that the allocation is very light, in PHP 7, we allocate a full buffer
at once , and not one buffer for each slot. The performance inpact of such
an allocation is really really tiny.
Julien.Pauli