奇妙なパフォーマンスの問題のように思われる問題に遭遇しました。このコードの実行:
<?php
function test_ref(&$test)
{
for ($i = 0; $i < 100000; $i++)
{
$foo = "s" . rand(1, 1000);
if (!array_key_exists($foo, $test))
{
$test[$foo] = array();
}
$test[$foo][] = rand(1, 10);
}
}
function test()
{
$test = array();
for ($i = 0; $i < 100000; $i++)
{
$foo = "s" . rand(1, 1000);
if (!array_key_exists($foo, $test))
{
$test[$foo] = array();
}
$test[$foo][] = rand(1, 10);
}
return $test;
}
$scriptstart = microtime(true);
$test = array();
test_ref($test);
$sum = 0;
foreach ($test as $key => $val)
{
foreach ($val as $val2)
{
$sum += $val2;
}
}
echo "sum " . $sum . "<br>";
$scriptelapsed = microtime(true) - $scriptstart;
echo "time taken " . $scriptelapsed . "<br>";
$scriptstart = microtime(true);
$test = test();
$sum = 0;
foreach ($test as $key => $val)
{
foreach ($val as $val2)
{
$sum += $val2;
}
}
echo "sum " . $sum . "<br>";
$scriptelapsed = microtime(true) - $scriptstart;
echo "time taken " . $scriptelapsed . "<br>";
?>
次の結果が得られます。
sum 548521
time taken 12.37544798851
sum 551236
time taken 0.29530310630798
何が起きてる?サブ配列を配列に挿入するという事実に関連しているようですが、参照渡しがそれほど遅くなる理由はわかりません。
(これは Suhosin Patch 0.9.9.1 を適用した PHP バージョン 5.3.3-7+squeeze14 にあります)
(編集:未設定の変数の使用を修正しましたが、結果は同じです)