ID: 51122 Updated by: ras...@php.net Reported By: y_kopel at walla dot com Status: Bogus Bug Type: Arrays related Operating System: linux PHP Version: 5.3.1 New Comment:
With gc on there are gc checks on every iteration. Just because it doesn't use more memory doesn't mean that gc does add more overhead. Previous Comments: ------------------------------------------------------------------------ [2010-02-24 06:57:03] y_kopel at walla dot com but... with and without gc_enable/gc_disable it consume the same ammount of memory but work 40 times longer with gc_enable ------------------------------------------------------------------------ [2010-02-23 13:02:23] j...@php.net Or run the script in 32bit system (and turn of GC :). With latest SVN checkout of PHP_5_3: $ src/build/php_5_3/sapi/cli/php -dmemory_limit=1G t.php 1.2259361743927 $ src/build/php_5_3/sapi/cli/php -dmemory_limit=1G -dzend.enable_gc=0 t.php 0.70840787887573 And with latest SVN checkout of PHP_5_2: $ src/build/php_5_2/sapi/cli/php -dmemory_limit=1G t.php 0.69131684303284 Not noticeable even. ------------------------------------------------------------------------ [2010-02-23 12:59:02] j...@php.net Just turn off garbage collection if this is a problem for you. (zend.enable_gc = off in php.ini) ------------------------------------------------------------------------ [2010-02-23 11:54:00] y_kopel at walla dot com shorter code: <?php for ($i = 0 ;$i < 1000000 ; $i++){ $users[$i]['SUM'] = 2; } $start = microtime(true); $sum = 0; foreach ($users as &$u){ if ($u['SUM'] > 1){ $sum++;} } echo microtime(true) - $start."\n"; ?> OUTPUT ====== php 5.2.1 ========= 0.328261852264 php 5.3.1 ========= 42.350708961487 ------------------------------------------------------------------------ [2010-02-23 11:40:36] y_kopel at walla dot com Description: ------------ the iteration on arrays with calling functions is very slow comparing php 5.2.1 to 5.3.1 Reproduce code: --------------- <?php define("FLOATING_POINT",6); function ww($f){ echo sprintf("%.".FLOATING_POINT."f", $f)."\n"; } class A{ protected $users; function __construct(){ for ($i = 0 ;$i < 100000 ; $i++){ $this->users[$i]['ELEMENT'] = array("a","b"); $this->users[$i]['SUM'] = 2; } } function check_more_than_one_element(){ $sum = 0; foreach ($this->users as &$u){ if (count($u['ELEMENT']) > 1){ $sum++; } } return $sum; } function a_check_more_than_one_element(){ $sum = 0; foreach ($this->users as &$u){ if ($u['SUM'] > 1){ $sum++; } } return $sum; } } $a = new A(); $start = microtime(true); echo "-----\n"; for ($i = 0 ;$i < 5 ; $i++){ $a->check_more_than_one_element(); $a->check_more_than_one_element(); $a->check_more_than_one_element(); $a->check_more_than_one_element(); } echo "-----\n"; echo microtime(true) - $start."\n"; $a = new A(); $start = microtime(true); echo "-----\n"; for ($i = 0 ;$i < 5 ; $i++){ $a->a_check_more_than_one_element(); $a->a_check_more_than_one_element(); $a->a_check_more_than_one_element(); $a->a_check_more_than_one_element(); } echo "-----\n"; echo microtime(true) - $start."\n"; ?> Expected result: ---------------- php 5.2.1 ========= ----- ----- 1.75261092186 ----- ----- 1.05390191078 Actual result: -------------- php 5.3.1 ========= ----- ----- 58.992564916611 ----- ----- 30.829360961914 ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=51122&edit=1