結論としては速度はほぼ同じ。
ただし、配列の階層を深くしたときには面白い結果が出た。
コード(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

PHP5.2.0でserialize()とjson_encode()はどちらが速いのか
1 Comment
»
コメントはお気軽にどうぞ




var_exportとevalも試していただきたいです。
Comment by kokoromo — 2006年12月29日 @ 15:05