note 127563 added to function.array-shift
| From: | malima at main dot php dot net | Date: | Wed, 31 Aug 2022 20:12:04 +0000 |
| Subject: | note 127563 added to function.array-shift | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-219504@lists.php.net to get a copy of this message | ||
A simple benchmark (PHP 8.1.9 + macOS 12.4)
<?php
ini_set('memory_limit', -1);
$times = 25_000;
$length = 256;
$arr = [];
$random = random_bytes(($times + $length) / 2);
$random = bin2hex($random);
// benchmark array_shift()
for ($i = 0; $i < $times; $i++) {
$arr[$i] = substr($random, $i, $length);
}
$shiftTimer = -hrtime(true);
for ($i = 0; $i < $times; $i++) {
$value = array_shift($arr);
}
$shiftTimer += hrtime(true);
// benchmark array_reverse() + array_pop() + array_reverse()
for ($i = 0; $i < $times; $i++) {
$arr[$i] = substr($random, $i, $length);
}
$reverseTimer = -hrtime(true);
for ($i = 0; $i < $times; $i++) {
$arr = array_reverse($arr);
$value = array_pop($arr);
$arr = array_reverse($arr);
}
$reverseTimer += hrtime(true);
// benchmark array_reverse() + array_pop()
for ($i = 0; $i < $times; $i++) {
$arr[$i] = substr($random, $i, $length);
}
$popTimer = -hrtime(true);
$arr = array_reverse($arr);
for ($i = 0; $i < $times; $i++) {
$value = array_pop($arr);
}
$popTimer += hrtime(true);
// benchmark $arr[key()]+ unset(key())
for ($i = 0; $i < $times; $i++) {
$arr[$i] = substr($random, $i, $length);
}
$keyTimer = -hrtime(true);
reset($arr);
for ($i = 0; $i < $times; $i++) {
$key = key($arr);
$val = $arr[$key];
unset($arr[$key]);
}
$keyTimer += hrtime(true);
print_r([
'shift' => $shiftTimer / (10 ** 9),
'reverse' => $reverseTimer / (10 ** 9),
'pop' => $popTimer / (10 ** 9),
'key' => $keyTimer / (10 ** 9),
]);
?>
Results interpretation:
On an array of 25,000 unique items, each item a string of 256 byte:
and key() + unset() is very fast.
array_shift() is ~400 times slower
array_reverse() + array_pop() + array_reverse() is ~5,000 times slower.
p.s. I'm implementing a queue, so I need to add another array_reverse() after array_pop() which
makes it extremely slow inside a loop. array_reverse() + array_pop() has no use for me, I just added
for sake of checking it's performance. It is as fast as key() + unset().
----
Server IP: 45.112.84.4
Probable Submitter: 185.85.3.173 (proxied: 5.45.102.119)
----
Manual Page -- https://php.net/manual/en/function.array-shift.php
Edit -- https://main.php.net/note/edit/127563
Del: integrated -- https://main.php.net/note/delete/127563/integrated
Del: useless -- https://main.php.net/note/delete/127563/useless
Del: bad code -- https://main.php.net/note/delete/127563/bad+code
Del: spam -- https://main.php.net/note/delete/127563/spam
Del: non-english -- https://main.php.net/note/delete/127563/non-english
Del: in docs -- https://main.php.net/note/delete/127563/in+docs
Del: other reasons-- https://main.php.net/note/delete/127563
Reject -- https://main.php.net/note/reject/127563
Search -- https://main.php.net/manage/user-notes.php