On Tue, Mar 14, 2017 at 11:21 AM, Julien Pauli <jpa...@php.net> 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. > Minor nit: [12=>'foo', 42=>'bar'] is not a packed array.
[0=>'foo', 2=>'bar'] is however, so your primary point stands. However it should be simple enough to detect when a packed array is also vector-like (indexed from 0 to n-1) and make this minor optimization. -Sara -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php