ziguzagu.org

Benchmark of Perl's YAML Parser

あるアプリで、まぁまぁ大きいYAML形式の設定ファイルを復数つかっていて、特別な理由がないまま(昔はあったのかもしれない) YAML.pm、YAML::Syck 両方を使っていたのを、なんとなく YAML.pm で統一しようかなぁと思い、念のためベンチとってみた。YAML::XS も添えて。

#!/usr/bin/env perl
use strict;
use warnings;

use Benchmark qw( cmpthese );
use YAML ();
use YAML::Syck ();
use YAML::XS ();

open my $fh, '<', shift;
my $data = do { local $/; <$fh> };
close $fh;

cmpthese(100, {
    'YAML(' . $YAML::VERSION . ')'  => sub {
        YAML::Load($data);
    },
    'YAML::XS(' . $YAML::XS::VERSION . ')' => sub {
        YAML::XS::Load($data);
    },
    'YAML::Syck(' . $YAML::Syck::VERSION . ')' => sub {
        YAML::Syck::Load($data);
    },
});

6200行くらいあるもののそんなに複雑じゃない(アンカー&エイリアスや複数行データとかない) YAML ファイルのパースの結果、

➜ perl yaml-parser-bench.pl foo.yaml
                    Rate       YAML(0.84) YAML::Syck(1.27)   YAML::XS(0.41)
YAML(0.84)       0.969/s               --             -98%             -99%
YAML::Syck(1.27)  59.2/s            6007%               --             -21%
YAML::XS(0.41)    74.6/s            7602%              26%               --

と、おもいのほか差がでた。アプリの起動時にはこれ以外にも何個かYAMLの読み込みがあって、YAML.pm に変更したところ明らかに起動もおそく…。

なので、YAML.pm ではなく YAML::Syck の方に寄せるか YAML::XS に行ってみるかだけど、なんとなく YAML::XS だろうか。libsyck (YAML::Syck) v.s. libyaml (YAML::XS) の図でいうと libyaml のほうが広く使われている気配を感じなくもないが、よくはわからない…。