JSON::DWIW vs JSON::Syck vs JSON

最近CPANJSON::DWIWというJSON parserがリリースされて居ました。
このモジュールのPODにはBenchmarkの結果があり、JSON, JSON::Syckとのベンチ結果が載っていますが、なんとJSON::Syckより速いとの結果が出ています!

ちょっと気になったので自分でもベンチマークを取ってみました。

ソース

下記のような感じです。


#!/usr/bin/perl

use strict;
use warnings;

use Benchmark;
use Data::Dump qw/dump/;
use File::Slurp;
use JSON qw();
use JSON::Syck;
use JSON::DWIW;

our $json_file = $ARGV[0];

die("not json file") unless ($json_file && -e $json_file);

our $json_data = File::Slurp::slurp($json_file);

sub json_to_obj {
    my $json_data = shift;

    JSON::jsonToObj($json_data);
}

sub json_to_obj_syck {
    my $json_data = shift;

    JSON::Syck::Load($json_data);
}

sub json_to_obj_dwiw {
    my $json_data = shift;

    JSON::DWIW->from_json($json_data);
}

timethese(
    10000, {
        'JSON' => sub { json_to_obj($json_data); },
        'JSON::Syck' => sub { json_to_obj_syck($json_data) },
        'JSON::DWIW' => sub { json_to_obj_dwiw($json_data) }
    }
);

ベンチマーク結果

下記のようになりました。

Benchmark: timing 10000 iterations of JSON, JSON::DWIW, JSON::Syck...
      JSON: 180 wallclock secs (179.36 usr +  0.12 sys = 179.48 CPU) @ 55.72/s (n=10000)
JSON::DWIW: 12 wallclock secs (12.04 usr +  0.01 sys = 12.05 CPU) @ 829.88/s (n=10000)
JSOJSON::Syck: 37 wallclock secs (36.48 usr +  0.23 sys = 36.71 CPU) @ 272.41/s (n=10000)

JSONモジュールが話にならない位遅いのは予想通りとして、JSON::Syckよりも約3倍速いと言える結果が出ました。これは凄い。

まだリリースしたてのモジュールみたいなんである程度枯れて欲しいとは思いますが、今後注目のモジュールですね。

追記

実験用データを晒すべきとのコメントを早くも頂きましたので、こちらがテストデータです。

comment

  1. nekokak
    2007-03-23 09:35:52

    http://search.cpan.org/dist/JSON-XS-0.1/XS.pm
    入れ違いにこんなの出ましたね。

  2. ZIGOROu
    2007-03-23 11:31:32

    > nekokakさん

    うわ、本当だ。しかも明らかに対抗馬として出してますね。
    追試、した方がいいっすかね?w

    しかも抜群に速い。。。

  3. 2007-03-25 04:00:56

    JSON::XSですが、FreeBSD 6-Stableだとこけます。
    とはいっても
    --- XS.xs Sat Mar 24 10:14:01 2007
    +++ /home/dankogai/cpan/JSON-XS-0.31-dan/XS.xs Sun Mar 25 03:09:34 2007
    @@ -305,7 +305,7 @@
    if (enc->flags & F_CANONICAL)
    {
    HE *he, *hes [count];
    - int fast = 1;
    + int fast = 0;

    i = 0;
    while ((he = hv_iternext (hv)))
    で直るのですが。作者には報告済み。
    #ソースも綺麗です、JSON::XS

  4. ZIGOROu
    2007-03-26 11:17:47

    > 弾さん

    弾さんの0.31の状態からだいぶ進化して今は0.8まで上がってますね。http://search.cpan.org/src/MLEHMANN/JSON-XS-0.8/Changes

    #ソースも綺麗です、JSON::XS

    XS未体験の人にも良いソースですかね?^^;

Comment Form
remember info

trackback

trackback url
trackback count
0
Recent Entries
  1. perlで気軽にsitemap.xmlを作る
  2. XULでCanvasエディターを作ってみた
  3. nsIObserverServiceを使って複数のobserverに通知を行う
  4. CGI::Application::Plugin::Cache::Adaptive Release
  5. Gearmanを使ってみた
  6. 「正しくHTMLを書こうと心がけている人に5つの質問」の回答
  7. Modules in Games-Nintendo-Wii-Mii
  8. Module-Starterのカスタマイズ
  9. JSON::DWIW vs JSON::Syck vs JSON
  10. よろしくお願い致します
Archives
  1. 2008年02月 (1)
  2. 2007年06月 (2)
  3. 2007年05月 (1)
  4. 2007年04月 (4)
  5. 2007年03月 (2)

all

categories
RSS/Atom Feed
license
Creative Commons License
Powered by