php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #51122 the iteration on arrays with calling functions is very slow
Submitted: 2010-02-23 11:40 UTC Modified: 2010-02-24 07:19 UTC
From: y_kopel at walla dot com Assigned:
Status: Not a bug Package: Arrays related
PHP Version: 5.3.1 OS: linux
Private report: No CVE-ID: None
 [2010-02-23 11:40 UTC] 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


Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2010-02-23 11:54 UTC] 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 12:59 UTC] jani@php.net
Just turn off garbage collection if this is a problem for you. (zend.enable_gc = off in php.ini)
 [2010-02-23 13:02 UTC] jani@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-24 06:57 UTC] 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-24 06:59 UTC] rasmus@php.net
With gc on there are gc checks on every iteration.  Just because it doesn't use more memory doesn't mean that gc doesn't add more overhead
 [2010-02-24 07:19 UTC] y_kopel at walla dot com
so... maybe it worth to erite an optimization on it?
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Apr 20 05:01:27 2024 UTC