ID:               22435
 User updated by:  carl at topthetable dot com
 Reported By:      carl at topthetable dot com
-Status:           Feedback
+Status:           Closed
 Bug Type:         Performance problem
 Operating System: Redhat 7.2
 PHP Version:      4.3.1
 New Comment:

OK, recompiled with the latest STABLE and I got the same results.  Then
in a flash of inspiration, I remembered that I have xdebug installed on
the Linux box with collect_params on - Sure enough, when I turn this
option off, the problem goes away.

So I'll go away and hide ...


Previous Comments:
------------------------------------------------------------------------

[2003-02-26 10:20:32] [EMAIL PROTECTED]

Please try using this CVS snapshot:

  http://snaps.php.net/php4-STABLE-latest.tar.gz
 
For Windows:
 
  http://snaps.php.net/win32/php4-win32-STABLE-latest.zip

I tested using this and got pretty same results on both linux and
macosx. Please test it..


------------------------------------------------------------------------

[2003-02-26 09:55:39] carl at topthetable dot com

Thanks for your reply, and better script.

Here are my results, showing the times on the Redhat and OSX boxes
respectively ...

Redhat 7.2 (PIII 700Mhz):
0.000356078147888
3.09110200405
24.5502359867
55.3548690081
136.626052976
... Gave up waiting.  As you can see, this is not correct behaviour. 
You can clearly see that the time isn't constant, nor increasingly
linearly.  I therefore say there is something wrong.

OSX (iBook, 500Mhz):
0.00040602684021
0.000491976737976
0.000488996505737
0.000484943389893
0.000471949577332
0.000415086746216
0.000434041023254
0.00104403495789
0.000488996505737
0.000432014465332
Avg: 0.00051580667495

This is as per your results.

------------------------------------------------------------------------

[2003-02-26 09:24:56] [EMAIL PROTECTED]

Try this script which actually shows the time _spend_ for count:

<?php

        function getmicrotime(){ 
                list($usec, $sec) = explode(" ",microtime()); 
                return ((float)$usec + (float)$sec); 
        }
        
        $tot = 0;

        for ($j=0; $j < 10; $j++) {
                $time = dosize($j * 1000);
                echo $time,"\n";
                $tot += $time;
        }
        
        echo "Avg: ", $tot/$j, "\n";

        function dosize( $y )
        {
                $t = array();

                for ( $i=0; $i<$y; $i++ ) {
                        $t[] = array( array( "3", "1" ), "3", array(
array ( "5", "1", "8" )) );
                }

                $start = getmicrotime();
                count( $t );
                $end = getmicrotime();

                return $end - $start;
        }
?>

Results for me:

Linux (double Celeron 500Mhz): 

0.00995302200317
0.000295042991638
0.000288963317871
0.000303030014038
0.000295042991638
0.000295042991638
0.000294089317322
0.000292062759399
0.000293016433716
0.000355005264282
Avg: 0.00126643180847

MacOSX, PowerPC (1Ghz or faster, not sure):

0.00011193752288818
9.0956687927246E-05
0.00010311603546143
0.00010299682617188
0.00010395050048828
0.00010097026824951
0.00011003017425537
0.00013697147369385
0.00010299682617188
0.00010597705841064
Avg: 0.00010699033737183

Nothing wrong here..


------------------------------------------------------------------------

[2003-02-26 08:11:50] carl at topthetable dot com

count() is increasingly slow when used to count large arrays.  This is
using 4.3.1 (compiled from source) on a Redhat 7.2 box.  The box has
about 80Mb free, so it's not a paging issue.  It works as expected on
Mac OS X running 4.3.1-dev.

Looking at PHP's and Zend's source, I would expect the time taken to
return the count() of an array to be similar regardless of the size of
the array.

Below is a script to demonstrate the problem.  


<?
  $st = microtime();

  echo "Script started:            ".microtime()."\n";

  dosize( 10 );
  dosize( 20 );
  dosize( 50 );
  dosize( 100 );
  dosize( 200 );
  dosize( 500 );
  dosize( 1000 );
  dosize( 5000 );
  dosize( 10000 );

  function dosize( $y ) {

    echo "Doing size $y\n";

    echo "  Starting array building:".microtime()."\n";

    $t = array();
    for ( $i=0; $i<$y; $i++ ) {
      $t[] = array( array( "3", "1" ), "3", array( array ( "5", "1",
"8" ) ) );
    }

    echo "  Array built:            ".microtime()."\n";

    count( $t );

    echo "  Count finished:         ".microtime()."\n";
  }
?>

------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=22435&edit=1

Reply via email to