Bug #80348 [Opn->Nab]: 10.000% inneficiency when using array_intersect_key and array_intersect_ukey
Edit report at https://bugs.php.net/bug.php?id=80348&edit=1
ID: 80348
Updated by: danack@php.net
Reported by: gilperon at gmail dot com
Summary: 10.000% inneficiency when using array_intersect_key
and array_intersect_ukey
-Status: Open
+Status: Not a bug
Type: Bug
Package: *General Issues
Operating System: All
PHP Version: 7.4.12
Block user comment: N
Private report: N
New Comment:
"using 2 supposedly very similar functions"
They perform similar tasks, they don't behave the same internally. One of them needs to call
userland code from internal code. The other one doesn't.
Reporting non-existant performance bugs is not useful. It takes people time away from fixing actual
bugs, or analysing where performance problems are across the whole of the project. Please just get a
faster server, rather than expecting other people to magically make your particular use-case faster.
Previous Comments:
------------------------------------------------------------------------
[2020-11-10 15:00:48] gilperon at gmail dot com
Description:
------------
Please run the test script. In my computer it outputs this:
1-> 0.0002131462097168
2-> 0.02832914352417
It's a 10.000% difference (100 * 0.0002 / 0.02) when using 2 supposedly very similar functions,
with only a small difference that one allows a callback to be used.
I really need to use array_intersect_ukey but the performance hit is huge. I tried
creating my own PHP implementation of array_intersect_ukey and it runs a lot faster,
but still is much slower than array_intersect_key and I really need something similar
to array_intersect_key in terms of speed (it can even be 10x slower, but not 100x or
worse.
Test script:
---------------
<?php
$a = array();
$b = array();
for ($i=0;$i<1000;$i++) {
$a[$i] = true;
$b[2*$i + 1] = true;
}
$z = microtime(true);
for ($i=0;$i<10;$i++) {
$temp = array_intersect_key($a,$b);
}
echo "\n 1-> " . (microtime(true) - $z);
$z = microtime(true);
for ($i=0;$i<10;$i++) {
$temp = array_intersect_ukey($a,$b,function($key1,$key2) {
if ($key1 === $key2) {
return 0;
}
else{
return $key2 - $key1;
}
});
}
echo "\n 2-> " . (microtime(true) - $z);
?>
Expected result:
----------------
Both functions should run at similar speeds.
Actual result:
--------------
One function runs 10.000% slower than the other.
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=80348&edit=1
Thread (7 messages)