perl でシリアライズのベンチマークをとってみた

By admin | 2009年4月10日

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

ってエラーがでた。

コメントはまだありません

コメントはまだありません。

このコメント欄の RSS フィード TrackBack URI

コメントをどうぞ

WordPress Themes