Data::EncoderでBenchmarkしてみた

ということで、まずは結果から。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
Benchmark: timing 10000 iterations of Dumper, JSON, MsgPack, Storable, YAML...
Dumper:  5 wallclock secs ( 4.02 usr +  0.00 sys =  4.02 CPU) @ 2485.09/s (n=10000)
JSON:  1 wallclock secs ( 1.37 usr +  0.02 sys =  1.39 CPU) @ 7199.42/s (n=10000)
MsgPack:  1 wallclock secs ( 0.72 usr +  0.00 sys =  0.72 CPU) @ 13927.58/s (n=10000)
Storable:  2 wallclock secs ( 1.53 usr +  0.05 sys =  1.58 CPU) @ 6349.21/s (n=10000)
YAML: 40 wallclock secs (40.19 usr +  0.06 sys = 40.25 CPU) @ 248.45/s (n=10000)
Rate     YAML   Dumper Storable     JSON  MsgPack
YAML       248/s       --     -90%     -96%     -97%     -98%
Dumper    2485/s     900%       --     -61%     -65%     -82%
Storable  6349/s    2455%     155%       --     -12%     -54%
JSON      7199/s    2798%     190%      13%       --     -48%
MsgPack  13928/s    5506%     460%     119%      93%       --

以下ベンチマークのソースです。 「use 5.12.1;」は、うっかりレンタルサーバーなどで実行しないようにする意味でも重要です。 まあ、私にとっては。 あと、せっかく「Data::Encoder」を使うので、encodeとdecodeは共通化して使ってみることにしました。 メソッドが共通化されるとソースが読みやすくて良いですね。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/env perl
#utf8
use utf8;
use 5.12.1;
# use Acme::PerlTidy;
use Benchmark qw(:all);
use Data::Dump qw/dd/;
use Data::Encoder;
sub run {
my $encoder = shift;
my $enc     = $encoder->encode([qw/foo bar/]);
my $data    = $encoder->decode($enc);
#    dd $data;
}
cmpthese(
timethese(
10000,
{
# Data::Encoder::JSON
JSON => sub {
my $encoder = Data::Encoder->load('JSON');
&run($encoder);
},
# Data::Encoder::Data::Dumper
Dumper => sub {
my $encoder = Data::Encoder->load('Data::Dumper');
&run($encoder);
},
# Data::Encoder::Data::MessagePack
MsgPack => sub {
my $encoder = Data::Encoder->load('Data::MessagePack');
&run($encoder);
},
# Data::Encoder::Storable
Storable => sub {
my $encoder = Data::Encoder->load('Storable');
&run($encoder);
},
# Data::Encoder::YAML
YAML => sub {
my $encoder = Data::Encoder->load('YAML');
&run($encoder);
},
}
)
);

Comments

comments powered by Disqus