2006年9月29日金曜日

[Perl] JSON vs XML ベンチマーク比較

JSON(JavaScript Object Notation)は、XMLに比べ
・データサイズが小さい。
・DOM不要。クライアント側は eval でそのまま値として使える。
・可読性が高い。
というように、軽量で取り扱いが簡単なのが特長ですが、
サーバ側の parse にどのくらい性能差があるのか検証してみました。

シナリオ
・JSON組:JSON::Syck、JSON
・XML組:XML::DOM、XML::LibXML
・対象データは、www.json.org にある JSON XML のサンプルを利用
・(怠けて)parse するだけ

ソースコード
use strict;
use lib( '$HOME/lib' );
use XML::DOM;
use XML::LibXML;
use JSON;
use JSON::Syck;
use Benchmark ':all';

my $str_xml = ここにサンプルXMLセット
my $str_js = ここにサンプルJSONセット

cmpthese(
timethese( 10000, {
'XML::DOM' => sub {
my $p = new XML::DOM::Parser( Sytle => 'Tree' );
my $tree = $p->parse( $str_xml );
},
'XML::LibXML'=> sub {
my $p = XML::LibXML->new();
my $doc = $p->parse_string( $str_xml );
},
'JSON' => sub { JSON::jsonToObj( $str_js ); },
'JSON::Syck' => sub { JSON::Syck::Load( $str_js ); },
})
);

結果
Benchmark: timing 10000 iterations of JSON, JSON::Syck, XML::DOM, XML::LibXML...
JSON: 7 wallclock secs ( 5.83 usr + 0.00 sys = 5.83 CPU) @ 1715.82/s (n=10000)
JSON::Syck: 1 wallclock secs ( 0.72 usr + 0.00 sys = 0.72 CPU) @ 13913.04/s (n=10000)
XML::DOM: 10 wallclock secs (10.02 usr + 0.05 sys = 10.08 CPU) @ 992.25/s (n=10000)
XML::LibXML: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 15421.69/s (n=10000)
Rate XML::DOM JSON JSON::Syck XML::LibXML
XML::DOM 992/s -- -42% -93% -94%
JSON 1716/s 73% -- -88% -89%
JSON::Syck 13913/s 1302% 711% -- -10%
XML::LibXML 15422/s 1454% 799% 11% --

XML::LibXML がTOP。僅差で JSON::Syck。続いて JSON 。JSON は pure perl で書かれているので仕方ないですね。XML::DOM がダントツビリ。
JSON はさらに、
・転送データ量が少なくなる
・クライアント側もDOMが不要になり軽量になる
というメリットも加味すると、JSON::Syck で JSON するのがベストといったところです。
参考)まるごとPerl! Vol.1に「JSONやらなきゃそんそん」載ってます。

0 件のコメント: