小さいファイルは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
という漠然とした印象だけ持っていたが、ベンチを見る限り、そういう使用法のすみわけにもきちんと意味がありそう。
先人達が誠意工夫した結果、必然的にそれぞれの使用法が決まっていったのかな。
今は眠くて頭が働かないので、あとでもう一度コード見てみて、妥当性をさぐってみよう。
では、寝る。