PEAR::Services_JSONとJsphonの検証してみた

PHP5.1.x系対応でjson_encode()を何とかしたいので、JSONエンコード系のライブラリの候補として、

PEAR::Services_JSON

Jsphon

を候補としているのですが、一体どっちが使い勝手がいいんだろうか?ということで、検証してみました。

テストケース

簡単な配列をそれぞれのライブラリでエンコードするコードです。

encode($data));
$bench = (time() - $st) + (microtime() - $stm);
var_dump($bench);


// Jsphonの場合
require_once('Jsphon-1.0.1/Jsphon.php');
var_dump(Jsphon::encode($data));
$bench = (time() - $st) + (microtime() - $stm);
var_dump($bench);

// メモリ使用量計測
echo memory_get_usage();

両方のベンチとメモリ使用量を簡単に計測してみました。
環境:Lampp (Ubuntu) PHP 5.3.1

比較と考察

結果はこんな感じでした。

PEAR::Services_JSONJsphon-1.0.2
エンコード結果"[1,2,3,4,5,6,7,8,9,10]""[1,2,3,4,5,6,7,8,9,10]"
実行時間(ms)0.0029170.012867
メモリ使用量(byte)436904657276
備考特に無しStrictエラー発生
Jsphonの方が少しだけ遅いですね。json_encodeは頻繁に実行するわけではないのでそれほど問題ないレベルかもしれません。 が、予想通りメモリ使用量に差が出ました。Services_JSONが約426KBに大してJsphonは約641KB。 マルチバイトが混じるともう少し差がでるかもしれません。 Jsphonは内部でエンコーダ・デコーダ・エラーハンドルファイルをrequireしているので、その分メモリを使うみたいですね。 あと、マルチバイト関連の処理が内部で走っているからかもしれないです。 さらに、JsphonはPHP5.3.1では Strict Errorが出ました。う〜ん、これはちょっと厳しいです。*1 $json = new Jsphon()としても、内部で「Jsphon_Error::singleton()」とやっているので、Static呼び出しは少しハックしないと回避できなさそうです。 1ファイルで全てまかなえるPEAR::Serveices_JSONか、ちょっと遅いけどマルチバイトに強いJsphonか。 個人的には日本製なのでJsphon押しなのですが、速度面とハックの手間を考えると さらに悩ましい問題になってしまいました><

*1:error_reportingを変更すれば回避できますが、CodeIgniterの設定を変更する必要があるんですよね。できればネイティブで動かしたいところです。