PHP5.2.0でserialize()とjson_encode()はどちらが速いのか

結論としては速度はほぼ同じ。
ただし、配列の階層を深くしたときには面白い結果が出た。

コード(test.php):

<?php
//  Configure Command =>  './configure' '--disable-all' '--without-all' '--enable-json'
$data = array();
for ($i = 0; $i < $argv[1]; $i++) {
    $data[] = array(uniqid() => uniqid(), $data); // 階層をどんどん深くする配列
    //$data[] = uniqid(); // 単純な配列
}
if (@$argv[2] == '1') {
    $buf = json_encode($data);
    json_decode($buf);
} else {
    $buf = serialize($data);
    unserialize($buf);
}

実行(Linux上のterminalで):

% time /usr/local/src/php-5.2.0/sapi/cli/php -c /etc/php.ini test.php 10 1

PHP5.2.0はコードのコメントにあるconfigureオプションをつけて、makeだけして実行。他のバージョンが動いていたのでmake installはしていない。
ベンチマークはいつものPEARのBenchmark_Timer.phpでやると実際の経過秒と表示される秒数に乖離が見られたのでtimeでやった。適当に10回ぐらいやって平均値を出す。

結果。json_encodeとだけあるのは、json_decodeのところをコメントにして実行したとき。serializeも同じ。縦軸は実行にかかった秒数。横軸はargv[1]の数(配列の深さと大きさ)です。

まず、json_decodeがargv[1]を10にしたところで落ちる。(エラーメッセージは表示されない)json_encodeだけなら20でも2秒程度で動く。
注目は、serialize。16を超えたところで一気に処理速度が落ち、20だと40秒近く要した。unserializeは配列の階層が増えても落ちることはなかった。

普通はそれほど深い階層の配列にすることはないが、注意は必要かもしれない。

階層が1の配列、array(1, 2, 3, …)の場合、10000でjson_encode+json_decode、serialize+unserializeともに10秒程度。

なおCPUは

% cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 15
model           : 4
model name      : Intel(R) Pentium(R) D CPU 2.80GHz
stepping        : 7
cpu MHz         : 2793.245
cache size      : 1024 KB
This entry was posted in いじる. Bookmark the permalink. Both comments and trackbacks are currently closed.

One Comment

  1. kokoromo
    Posted 2006/12/29 at 3:05 pm | Permalink

    var_exportとevalも試していただきたいです。

Page optimized by WP Minify WordPress Plugin