|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2002-08-09 07:22 UTC] jean-charles dot rogez at devoteam dot 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;
?>
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sat Oct 25 17:00:01 2025 UTC |
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)I did some testing on your function and it seems that array_shift is to blame. If I avoid using that function, the execution time drop down to few seconds. To cut down the problem: $size = 5000; $Li1 = array(); $Li1 = array_pad($Li1, $size, 0); $Li2 = array(); while ($Li1) { $Li2[] = array_shift($Li1); } This takes 1.8 s on my P3 933 MHz. If I increase $size to 10000 it takes 16 s. The rest of array functions seem to be working fine.