perl でシリアライズのベンチマークをとってみた
Perl でシリアライズの方法が色々あるのでちょっとベンチマークをとってみた。
ちなみに試したのは Storable, FreezeThaw, Data::Dumper, XML::Dumper の4つ。
結果だけを先にいうと一番のおすすめは Data::Dumper でファイルに出力し、eval するのが一番よさげ。
ベンチマークをとったコード(シリアライズ)
#!/usr/bin/perl use strict; use warnings; use Benchmark qw/cmpthese/; use Storable; use FreezeThaw; use Data::Dumper; use XML::Dumper; $| = 1; package Human; use base qw/Class::Accessor::Fast/; __PACKAGE__->mk_accessors( qw/name email key/ ); package main; my $human = new Human(); $human->name('dealforest'); $human->email('dealforest.net@gmail.com'); open my $store, '>', 'store'; open my $dumper, '>', 'dumper'; open my $freezethaw, '>', 'freezethaw'; open my $xml, '>', 'xmldumper.xml'; my $dump = new XML::Dumper; cmpthese(50000000 ,{ dumper => &data_dumper, store_fd => &storable_store, freeze => &freezethaw_freeze, pl2xml => &xmldumper_pl2xml, }); close $store; close $xml; close $dumper; close $freezethaw; sub storable_store { Storable::store_fd $human, $store; } sub data_dumper { print $dumper Dumper $human; } sub freezethaw_freeze { print $freezethaw FreezeThaw::freeze $human; } sub xmldumper_pl2xml { print $xml $dump->pl2xml($human); } 1;
ベンチマークの結果(シリアライズ)
Rate pl2xml freeze dumper store_fd pl2xml 68493151/s -- -29% -41% -51% freeze 96153846/s 40% -- -17% -31% dumper 116279070/s 70% 21% -- -16% store_fd 138888889/s 103% 44% 19% -- (※)ベンチの結果はカオスなくらい毎回かわりますw そのためどらが一概にはやいのか良くわからいです。。。 平均的にみたらこれかなってのをだしてます。
ベンチマークをとったコード(デシリアライズ)
#!/usr/bin/perl use strict; use warnings; use Benchmark qw/cmpthese/; use Storable; use FreezeThaw; use Data::Dumper; use XML::Dumper; $| = 1; my $xmldump = new XML::Dumper; cmpthese(100000, { dumper => sub { open my $fh, '<', 'dumper'; my @a = <$fh>; my $VAR1; eval(join '', @a); close $fh; }, fd_retrieve => sub { open my $fh, '<', 'store'; Storable::fd_retrieve($fh); }, freeze => sub { open my $fh, '<', 'freezethaw'; my $a = <$fh>; FreezeThaw::thaw($a); close $fh; }, pl2xml => sub { open my $fh, '<', 'xmldumper.xml'; my @a = <$fh>; $xmldump->xml2pl(join '', @a); close $fh; }, } ); 1;
ベンチマークの結果(デシリアライズ)
Rate pl2xml freeze dumper fd_retrieve pl2xml 2703/s -- -71% -81% -90% freeze 9183/s 240% -- -35% -66% dumper 14025/s 419% 53% -- -47% fd_retrieve 26667/s 886% 190% 90% --
まとめ
シリアライズするコストはどれも似たような感じ。
デシリアライズのコストは意外に XML::Dumper がはやかった。
Storable がおそかったのは少しびっくりした。
デシリアライズのコストは Storable が一番。その次に Data::Dumper がはやかった。
ただ XML::Dumper は文字データしか扱えない。バイナリ絡むと無理。
FreezeThaw も若干微妙。
その辺で一番便利だったのが Data::Dumper だった。
swfをパースしたインスタンスでも復元できた。
つまりは Data::Dumepr を選んどくとが一番幸せになれそう。
追記: 2009-04-10T03:18:27+00:00
Storable は GLOB をシリアライズできないみたい。
Can't store GLOB items
ってエラーがでた。