PHPのserializeとvar_export

突然気になったので、serialize->unserializeとvar_export->include_onceについてベンチマーク。

一応、単純な配列構造のデータが対象(YAMLだとかJSONだとかのキャッシュ目的ね)。結果から言えば、解凍しないだけvar_exportが早い。早いけど、これ使っていいのかな?100*100*100の配列ってのも現実味が無い?var_exportが複雑な配列になった時にどうなるかも見た方がいいかな。

以下テストスクリプトとその結果。サンプル数少ないかな?

<?php

set_time_limit(0);

define('SAMPLE_SIZE', 10);

# source initialize
$data = array();
for ($i = 0; $i < 100; $i++) {
    for ($j = 0; $j < 100; $j++) {
        for ($k = 0; $k < 100; $k++) {
            $data[$i][$j][$k] = $k;
        }
    }
}

$bench = array(
               array(0, 0, -1, 1000000000),
               array(0, 0, -1, 1000000000),
               array(0, 0, -1, 1000000000),
               array(0, 0, -1, 1000000000),
               );

for ($t = 1; $t <= SAMPLE_SIZE; $t++) {

    # serialize [0]
    $start = time();
    $serial = serialize($data);
    $clock = time() - $start;
    file_put_contents('serial.txt', $serial);
    calc($clock, $t, &$bench[0]);

    # export [1]
    $start = time();
    $export = var_export($data, true);
    $clock = time() - $start;
    file_put_contents('export.php', "<?php\n\$data = " . $export . ";\n?>");
    calc($clock, $t, &$bench[1]);

    # unserialize [2]
    $start = time();
    $unserialized_data = unserialize(file_get_contents('serial.txt'));
    $clock = time() - $start;
    calc($clock, $t, &$bench[2]);

    # import [3]
    $start = time();
    include('export.php');
    $clock = time() - $start;
    calc($clock, $t, &$bench[3]);

}

# calculate average
$bench = array_map(create_function('$a','$a[1] = intval($a[0] / SAMPLE_SIZE); return $a;'), $bench);

echo "-CONDITION-:TOTAL/AVG/MAX/MIN\n";
echo "  Serialize: " . implode('/', $bench[0]) . "\n";
echo "     Export: " . implode('/', $bench[1]) . "\n";
echo "Unserialize: " . implode('/', $bench[2]) . "\n";
echo "     Import: " . implode('/', $bench[3]) . "\n";

function calc($clock, $t, $bench) {
    $bench[0] += $clock;
    $bench[2] = ($clock > $bench[2]) ? $clock : $bench[2];
    $bench[3] = ($clock < $bench[3]) ? $clock : $bench[3];
}

/**
 * -CONDITION-:TOTAL/AVG/MAX/MIN
 *   Serialize: 68/6/8/6
 *      Export: 81/8/9/7
 * Unserialize: 435/43/53/39
 *      Import: 169/16/23/14
 */

?>

include_onceじゃいくらサンプルとっても駄目だね。というわけで、サンプリング用にincludeで再テストしました。

プロフィール

このブログ記事について

このページは、koshigoeが2006年8月10日 01:44に書いたブログ記事です。

ひとつ前のブログ記事は「RSS+SSE使いたいけど未だにネタが思いつかない」です。

次のブログ記事は「変な風にRubyにかぶれてみる」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。