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
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: y_kopel at walla dot com
New email:
PHP Version: OS:

 

 [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

Pull Requests

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-2025 The PHP Group
All rights reserved.
Last updated: Sat Jul 12 05:01:33 2025 UTC