2008/11/13

PHP4のunserialize関数は遅い

PHP4のunserialize関数はめちゃくちゃ遅いことに気がついた。

例えば下記のようなコードをPHP4とPHP5で実行速度を比べてみる。

// $arrayは連想配列とする。
$serializeData = serialize($array);

$startTime = getmicrotime();
// アンシリアライズを単純に繰り返す。
for ( $i = 0; $i < style="color: rgb(0, 0, 153);">$i++ ) {
    $unserializeData = unserialize($serializeData);
}
$endTime = getmicrotime();

echo $startTime - $endTime;

function getmicrotime(){
    list($usec, $sec) = explode(" ",microtime());
    return ((float)$sec + (float)$usec);
}



配列数が増えてくると実行速度がどのように変化するか調べてみた。
(ただしWin32版)













配列数100050001000050000100000
PHP40.34秒3.60秒13.17秒266.86秒-
PHP50.19秒1.17秒2.45秒15.06秒50.67秒
増加量179%309%538%1772%


遅いだけならまあ関数を使わないだけで済むのだけど、実はsessionを利用するときに問題となる。
http://jp.php.net/manual/ja/intro.session.php より引用。

全ての登録された変数は、リクエストが終了した後に、シリアル化されます。・・・

マニュアルではどういう意味か分かりにくいが、実際は連想配列をセッションに保存する時はserialize/unserializeされている(と思われる)。

つまり処理の高速化の目的で巨大な連想配列をセッションに保存して利用しても、PHP4では大して早くなっていない可能性がある。

まあ特別な理由が無ければPHP5を使おうという結論で・・・。

0 件のコメント: