イテレーションのベンチマーク

ランダム順の整数添え字配列のイテレーションベンチマークをとってみる。

function mtime_diff($a, $b)
{
    list($a_dec, $a_sec) = explode(' ', $a);
    list($b_dec, $b_sec) = explode(' ', $b);
    return $b_sec - $a_sec + $b_dec - $a_dec;
}

function sq($a) {
	return $a*$a;
}

function sq2(&$i, $k) {
	$i *= $i;
}

$arr = array();
$numbers = range (1, 10000);
shuffle ($numbers);
foreach ($numbers as $num) {
	$arr[$num] = $num;
}
unset($numbers);

$c = $arr;
$st = microtime();
foreach ($c as $k => $v) {
	$c[$k] = $v*$v;
}
echo sprintf("%0.5f <br>", mtime_diff($st, microtime()));

$e = $arr;
$st = microtime();
foreach (array_keys($e) as $k) {
	$e[$k] = $e[$k]*$e[$k];
}
echo sprintf("%0.5f <br>", mtime_diff($st, microtime()));

$f = $arr;
$st = microtime();
$f = array_map('sq', $f);
echo sprintf("%0.5f <br>", mtime_diff($st, microtime()));


$g = $arr;
$st = microtime();
array_walk($g, 'sq2');
echo sprintf("%0.5f <br>", mtime_diff($st, microtime()));

結果。

0.03259
0.04008
0.02431
0.02606 

単純なイテレーションだとarray_mapが普通のforeachより25%ほど速い。まー、それほど拘る速度差でもないか。