Req #79421 [Opn->Dup]: foreach (array_keys($arr) as $k) is slow

From: Date: Mon, 18 Oct 2021 15:51:38 +0000
Subject: Req #79421 [Opn->Dup]: foreach (array_keys($arr) as $k) is slow
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-237271@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=79421&edit=1

 ID:                 79421
 Updated by:         cmb@php.net
 Reported by:        michael dot vorisek at email dot cz
 Summary:            foreach (array_keys($arr) as $k) is slow
-Status:             Open
+Status:             Duplicate
 Type:               Feature/Change Request
 Package:            Performance problem
 PHP Version:        7.4.4
-Assigned To:        
+Assigned To:        cmb
 Block user comment: N
 Private report:     N

 New Comment:

Closing as duplicate of bug #77532.


Previous Comments:
------------------------------------------------------------------------
[2020-04-10 18:43:25] michael dot vorisek at email dot cz

As long as iterate thru the whole dataset, otherwise it can be orders of magnitude slower.

$c = 20000;

// create test array
$arr = [];
for ($i = 0; $i < 1000; $i++) {
    $arr[$i . 'x'] = $i . 'y'; // use sting keys, they may be slower than
numeric ones
}

$t = microtime(true);
for ($i = 0; $i < $c; $i++) {
    foreach ($arr as $k => $ignore) {
        $u = $k . '.'; // use key
        break;
    }
}
var_dump(round(microtime(true) - $t, 6));

$t = microtime(true);
for ($i = 0; $i < $c; $i++) {
    foreach (array_keys($arr) as $k) {
        $u = $k . '.'; // use key
        break;
    }
}
var_dump(round(microtime(true) - $t, 6));

------------------------------------------------------------------------
[2020-04-10 07:00:55] alexinbeijing at gmail dot com

Interestingly, benchmarking shows that the 2nd form of the code you show here is actually *slower*
than the 1st.

I don't know if foreach(array_keys(...) as ...) has already been optimized internally, but in
any case, it doesn't seem that this suggested optimization is necessary. Recommend this ticket
can be closed.

------------------------------------------------------------------------
[2020-03-27 19:50:24] michael dot vorisek at email dot cz

Description:
------------
This is a feature request to optimize:

foreach (array_keys($arr) as $k) {}

instead of building array of keys optimize this in PHP internally to behave like:

foreach ($arr as $k => $ignore) {}

It is important to optimize it as foreach on keys is very commonly used.



------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=79421&edit=1


Thread (4 messages)

« previous php.bugs (#237271) next »