Req #79421 [Com]: foreach (array_keys($arr) as $k) is slow
| From: | michael dot vorisek at email dot cz | Date: | Fri, 10 Apr 2020 18:43:25 +0000 |
| Subject: | Req #79421 [Com]: foreach (array_keys($arr) as $k) is slow | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-226522@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
Comment by: michael dot vorisek at email dot cz
Reported by: michael dot vorisek at email dot cz
Summary: foreach (array_keys($arr) as $k) is slow
Status: Open
Type: Feature/Change Request
Package: Performance problem
PHP Version: 7.4.4
Block user comment: N
Private report: N
New Comment:
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));
Previous Comments:
------------------------------------------------------------------------
[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