"foreach ($arr as $k => $v)" is 2 times as faster as "foreach ($arr as
$v)" in php4.3.x

both test under lastest cvs.

4.3.12-dev
testing with array[] = string
$v:     2.5590002536774
$k=>$v: 0.7020001411438
$v each():      1.025000333786
$k $v each():   1.1790001392365
testing with array[] = array(string)
$v:     0.50299978256226
$k=>$v: 0.70599985122681
$v each():      0.9909999370575
$k $v each():   1.172000169754

5.1.0-dev
testing with array[] = string
$v:     0.15599966049194
$k=>$v: 0.19999980926514
$v each():      0.78099966049194
$k $v each():   0.77299976348877
testing with array[] = array(string)
$v:     0.16900014877319
$k=>$v: 0.19900012016296
$v each():      0.71399998664856
$k $v each():   0.77100014686584


<?php
function mtime()
{
       list($s, $ms) = explode(' ', microtime());
       return $s + $ms;
}

function stopwatch()
{
       static $now;
       $old = $now;
       $now = mtime();
       return $now - $old;
}

function runtest($arr)
{
       $count = 1000;
       stopwatch();
       for ($i = 0; $i < $count; $i ++);
       $extra = stopwatch();

       stopwatch();
       for ($i = 0; $i < $count; $i ++) {
               $r = $arr;
               foreach ($r as $v) $dummy = $v;
       }
       echo '$v:', "\t", stopwatch() - $extra, "\n";

       stopwatch();
       for ($i = 0; $i < $count; $i ++) {
               $r = $arr;
               foreach ($r as $key => $v) $dummy = $v;
       }
       echo '$k=>$v:', "\t", stopwatch() - $extra, "\n";

       stopwatch();
       for ($i = 0; $i < $count; $i ++) {
               $r = $arr;
               reset($r);
               while (list(, $v) = each($r)) $dummy = $v;
       }
       echo '$v each():', "\t", stopwatch() - $extra, "\n";

       stopwatch();
       for ($i = 0; $i < $count; $i ++) {
               $r = $arr;
               reset($r);
               while (list($k, $v) = each($r)) $dummy = $v;
       }
       echo '$k $v each():', "\t", stopwatch() - $extra, "\n";
}

echo PHP_VERSION, "\n";

echo "testing with array[] = string\n";
$arr = array();
for ($i = 0; $i < 100; $i ++) {
       $arr[] = str_repeat('-', 10240);
}
runtest($arr);

echo "testing with array[] = array(string)\n";
$arr = array();
for ($i = 0; $i < 100; $i ++) {
       $arr[] = array(str_repeat('-', 10240));
}
runtest($arr);
echo "testing with queryAll\n";

[quote: http://ez.no/community/blog/foreach_performance_improvement_backport]
This patch improves performance with foreach() where the key of the
array element is not interesting (for example foreach($array as
$value); ).
[/quote]

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to