小さいファイルはJSONで、大きいファイルはYAMLで読み込むべき? JSON&YAMLのファイルロードのBench結果

Perl で YAML と JSON のベンチマーク比較 - Daio Today

こちらの記事を読みました。

結果的には、YAML と 比べて JSON の方が 6倍〜8倍高速。ただし、これはデータ量が少ない場合で、データ量が大きくなると 0.5倍〜0.8倍 と差が縮まってしまう。

なるほど、そうなのか。
それなら、データ量がある一定量増えたところで、YAMLのほうが早くなったりするのかな?

と、思い実験

1kb,2kb,3kb,4kb,5kb,10kbのファイル、yamlとjsonでそれぞれ用意してみた。
YAMLとJSON
YAML::SyckとJSON::Syckをそれぞれ比べてみる。

コード

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;
use Benchmark qw(cmpthese timethese :hireswallclock);
use YAML;
use JSON;
use YAML::Syck;
use JSON::Syck;


my $s_yaml    = &read_file('s.yaml');
my $s_json    = &read_file('s.json');
my $m_yaml    = &read_file('m.yaml');
my $m_json    = &read_file('m.json');
my $l_yaml    = &read_file('l.yaml');
my $l_json    = &read_file('l.json');
my $xl_yaml   = &read_file('xl.yaml');
my $xl_json   = &read_file('xl.json');
my $xxl_yaml  = &read_file('xxl.yaml');
my $xxl_json  = &read_file('xxl.json');
my $xxxl_yaml = &read_file('xxxl.yaml');
my $xxxl_json = &read_file('xxxl.json');

my $count = 1000;

main();

sub main {
    print "compare start \n";
    comp();
    print "\n\n syck compare start \n";
    Syck_comp();
}

sub comp{
    my $comp = timethese( $count, 
        {
            S_YAML    => sub { YAML::Load($s_yaml)         },
            S_JSON    => sub { JSON::from_json($s_json)    },
            M_YAML    => sub { YAML::Load($m_yaml)         },
            M_JSON    => sub { JSON::from_json($m_json)    },
            L_YAML    => sub { YAML::Load($l_yaml)         },
            L_JSON    => sub { JSON::from_json($l_json)    },
            XL_YAML   => sub { YAML::Load($xl_yaml)        },
            XL_JSON   => sub { JSON::from_json($xl_json)   },
            XXL_YAML  => sub { YAML::Load($xxl_yaml)       },
            XXL_JSON  => sub { JSON::from_json($xxl_json)  },
            XXXL_YAML => sub { YAML::Load($xxxl_yaml)      },
            XXXL_JSON => sub { JSON::from_json($xxxl_json) },
        }
    );
    cmpthese $comp;
}

sub Syck_comp{
    my $comp = timethese( $count, 
        {
            S_YAML    => sub { YAML::Syck::Load($s_yaml)    },
            S_JSON    => sub { JSON::Syck::Load($s_json)    },
            M_YAML    => sub { YAML::Syck::Load($m_yaml)    },
            M_JSON    => sub { JSON::Syck::Load($m_json)    },
            L_YAML    => sub { YAML::Syck::Load($l_yaml)    },
            L_JSON    => sub { JSON::Syck::Load($l_json)    },
            XL_YAML   => sub { YAML::Syck::Load($xl_yaml)   },
            XL_JSON   => sub { JSON::Syck::Load($xl_json)   },
            XXL_YAML  => sub { YAML::Syck::Load($xxl_yaml)  },
            XXL_JSON  => sub { JSON::Syck::Load($xxl_json)  },
            XXXL_YAML => sub { YAML::Syck::Load($xxxl_yaml) },
            XXXL_JSON => sub { JSON::Syck::Load($xxxl_json) },
        }
    );
    cmpthese $comp;
}

sub read_file {
    open my $fh, '<', $_[0] or die $!;
    local $\;
    <$fh>;
}

結果

YAMLとJSONの結果はこんな感じ。

読み込みファイル容量が3kbを超えた辺りで、YAMLが逆転した。

  • YAMLは読み込み速度がデータ容量に依存せず
  • JSONは読み込み速度がデータ容量に依存する

という感じの結果に。


グラフにするとこうなる



YAML::SyckとJSON::Syckを比べるとこんな感じ。

これはなんというか・・・。
実験方法がそもそも妥当なのか・・・?と思うような結果。


う〜ん。間違えたかな?
それともこれが正しい結果?
それなら、YAML::Syckすげ〜。だが。

まぁ、今回読み込みしかしてないしな。
今度、書き込みとかも比べて総合的に判断してみよう。

感想

今まで、

コンフィグはYAML
javascript ではJSON

という漠然とした印象だけ持っていたが、ベンチを見る限り、そういう使用法のすみわけにもきちんと意味がありそう。


先人達が誠意工夫した結果、必然的にそれぞれの使用法が決まっていったのかな。


今は眠くて頭が働かないので、あとでもう一度コード見てみて、妥当性をさぐってみよう。

では、寝る。