Y's note

Web技術・プロダクトマネジメント・そして経営について

本ブログの更新を停止しており、今後は下記Noteに記載していきます。
https://note.com/yutakikuchi/

serializeとjson関数の比較

概要

serializeとjson_encodeのどちらの利用が望ましいかを調べます。理由はWebAPIを作成するときにどのレスポンス形式が最適なのかを検証する必要がでてきたためです。事前に上がった意見としては”json_encodeの方がデータ容量少なくなるから速いっしょ”、”serializeの方がphpをそのまま扱っているんだから変換処理コストが少ないはず”などの意見がありましたが、どれが正確か分からないので実際に試してみます。

サンプルするデータ

50回実行して処理時間の平均値をサンプリングします。

  • php配列から各エンコード処理を施した時の処理コスト
    • シングルバイト文字列を含む配列を変換するコスト
    • マルチバイト文字列を含む配列を変換するコスト
  • エンコードしたデータからphp配列への復元処理コスト
    • シングルバイト文字列を含む配列エンコードしたデータをデコード
    • マルチバイト文字列を含む配列をエンコードしたデータをデコード

エンコード ソースコード

<?php

$data = array();
for( $i=0; $i<=10000; $i ++ ) {
    $data[] = "test"; //ここを適宜変えます。
}
$start = microtime();

//PHP serialize
$string = serialize( $data );
//JSON encode
//$string = json_encode( $data );

$end = microtime();
echo $end - $start . "\n";

デコード ソースコード

<?php

$data = array();
for( $i=0; $i<=10000; $i ++ ) {
    $data[] = "test"; //ここを適宜変えます。
}
//PHP serialize
$string = serialize( $data );

//JSON encode
//$string = json_encode( $data );

$start = microtime();
$data = unserialize( $string );
//json_decode( $string );
$end = microtime();
echo $end - $start . "\n";

エンコードの処理時間結果

php配列からのエンコード処理ではjson_encodeが速い/span>

形式 シングルバイト マルチバイト
serialize 0.00371922 0.0040066
json_encode 0.00123026 0.00314484

エンコードbyte数比較

php配列からのエンコード処理ではjson_encodeの方が生成Stringのバイト数が少なく済みそう

形式 シングルバイト マルチバイト
serialize 178919 248926
json_encode 70008 230024

デコード処理時間結果

エンコード文字列からのデコード処理ではunserializeが速い。
※この検証は元々のデータ形式が異なるものを扱うため、比較が適正ではないかもしれません。

形式 シングルバイト マルチバイト
unserialize 0.0007774 0.00080212
json_decode 0.00382754 0.00643018

まとめ

エンコードではjson_encode、デコードではunserializeが処理として速いことが分かった。
エンコード、デコード単体で処理の速さを比較することも大事だが、処理全体のtotalコストとしての見積が必要。
・個人的にはjson_encode,json_decodeを利用するのが良いと思う。(APIだと転送データ容量も減らせるので)