あるアプリで、まぁまぁ大きい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 のほうが広く使われている気配を感じなくもないが、よくはわからない…。