#18829 [Opn->Csd]: array_pop, array_shift, array_push... functions very slow with large arrays
| From: | rodif_bl@php.net | Date: | Fri, 09 Aug 2002 13:03:02 +0000 |
| Subject: | #18829 [Opn->Csd]: array_pop, array_shift, array_push... functions very slow with large arrays | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-16383@lists.php.net to get a copy of this message | ||
ID: 18829
Updated by: rodif_bl@php.net
Reported By: jean-charles.rogez@devoteam.com
-Status: Open
+Status: Closed
Bug Type: Arrays related
Operating System: Linux RedHat 7.1
PHP Version: 4.2.2
New Comment:
This bug has been fixed in CVS. You can grab a snapshot of the
CVS version at http://snaps.php.net/. In case this was a
documentation
problem, the fix will show up soon at http://www.php.net/manual/.
In case this was a PHP.net website problem, the change will show
up on the PHP.net site and on the mirror sites.
Thank you for the report, and for helping us make PHP better.
I recently fixed the speed for array_shift and array_pop. I'll look at
array_push see if there is anything good there. Try current CVS and
tell me if the speed increased for you.
Previous Comments:
------------------------------------------------------------------------
[2002-08-09 07:29:25] jean-charles.rogez@devoteam.com
Oops ! I forgot the end of the script
Add
while ($ITER-- > 0) {
$result = test_lists();
}
print "$result\n";
?>
In the previous comment, N meant ITER. (ITER = 50)
------------------------------------------------------------------------
[2002-08-09 07:22:28] jean-charles.rogez@devoteam.com
The following program takes a very long time to execute.
On the same machine (P4 1.5GHz), under the same conditions, with N=50,
PHP needs 87m30s !?!! The same program written in PERL 5.6 needs only
2.415s and in python 2.1.2 3.273s ! array_pop and array_push functions
seems to be extremelly slow with large arrays. This problem has been
detected on PHP 4.0.6 and is still present in 4.2.2.
4.2.2 was compiled with the default settings (configure without
arguments).
<?php
function test_lists() {
global $size;
# create a list of integers (Li1) from 1 to SIZE
$Li1 = array();
$Li1 = array_pad($Li1, $size, 0);
# copy the list to Li2 (not by individual items)
$Li2 = $Li1;
$Li3 = array();
# remove each individual item from left side of Li2 and
# append to right side of Li3 (preserving order)
while ($Li2) {
$Li3[] = array_shift($Li2);
}
# Li2 must now be empty
# remove each individual item from right side of Li3 and
# append to right side of Li2 (reversing list)
while ($Li3) {
$Li2[] = array_pop($Li3);
}
# Li3 must now be empty
# reverse Li1 in place
$Li1 = array_reverse($Li1);
# check that first item is now SIZE
if ($Li1[0] != $SIZE) return(0);
# compare Li1 and Li2 for equality
$len1 = count($Li1);
$len2 = count($Li2);
$lists_equal = ($len1 == $len2);
if (! $lists_equal) return(0);
for ($i=0; $i<$len1; $i++) {
if ($Li1[$i] != $Li2[$i]) {
$lists_equal = 0;
break;
}
}
if (! $lists_equal) return(0);
# return the length of the list
return($len1);
}
$size = 10000;
$ITER = $argv[1];
if ($ITER < 1) $ITER = 1;
$result = 0;
?>
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=18829&edit=1