Skip to content

Instantly share code, notes, and snippets.

@jef-sure
Last active September 30, 2016 10:34
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save jef-sure/ef8849e6abbeb9b8aac74c71389886f7 to your computer and use it in GitHub Desktop.
Save jef-sure/ef8849e6abbeb9b8aac74c71389886f7 to your computer and use it in GitHub Desktop.
#!/usr/bin/perl
use Benchmark qw(:all);
use Storable;
use Clone;
use CBOR::XS;
use Data::MessagePack;
use Panda::Lib;
use Sereal;
use Sereal::Dclone;
use Data::Clone;
use feature 'state';
my %config = (
group => {
item1 => {
foo => 'value',
bar => 'value',
},
item2 => {
foo => 'value',
bar => 'value',
},
item3 => {
foo => 'value',
bar => 'value',
},
item4 => {
foo => 'value',
bar => 'value',
},
item5 => {
foo => 'value',
bar => 'value',
},
item6 => {
foo => 'value',
bar => 'value',
},
item7 => {
foo => 'value',
bar => 'value',
},
item8 => {
foo => 'value',
bar => 'value',
},
item9 => {
foo => 'value',
bar => 'value',
},
item10 => {
foo => 'value',
bar => 'value',
},
item11 => {
foo => 'value',
bar => {data => {map {$_ => 1} 1 .. 1000}},
},
},
);
sub cbor_clone {
state $cbor = CBOR::XS->new;
$cbor->decode($cbor->encode($_[0]));
}
sub dmp_clone {
state $mp = Data::MessagePack->new;
$mp->decode($mp->encode($_[0]));
}
sub sereal_clone {
state $dec = Sereal::Decoder->new;
state $enc = Sereal::Encoder->new;
$dec->decode($enc->encode($_[0]));
}
sub sereal_dclone {Sereal::Dclone::dclone($_[0])}
sub storable_clone {Storable::dclone($_[0])}
sub clone_clone {Clone::clone($_[0])}
sub data_clone {Data::Clone::clone($_[0])}
sub panda_clone {Panda::Lib::lclone($_[0])}
sub panda_fclone {Panda::Lib::fclone($_[0])}
cmpthese(
-2,
{ clone_clone => sub {clone_clone(\%config)},
data_clone => sub {data_clone(\%config)},
cbor_clone => sub {cbor_clone(\%config)},
storable_clone => sub {storable_clone(\%config)},
dmp_clone => sub {dmp_clone(\%config)},
panda_clone => sub {panda_clone(\%config)},
panda_fclone => sub {panda_fclone(\%config)},
sereal_clone => sub {sereal_clone(\%config)},
sereal_dclone => sub {sereal_dclone(\%config)},
}
);
=pod
Rate dmp_clone clone_clone storable_clone sereal_clone data_clone cbor_clone sereal_dclone panda_fclone panda_clone
dmp_clone 1292/s -- -21% -64% -68% -71% -71% -79% -81% -82%
clone_clone 1626/s 26% -- -55% -60% -63% -64% -73% -77% -77%
storable_clone 3584/s 177% 120% -- -11% -19% -20% -41% -49% -49%
sereal_clone 4030/s 212% 148% 12% -- -8% -10% -34% -42% -43%
data_clone 4399/s 240% 171% 23% 9% -- -2% -28% -37% -38%
cbor_clone 4502/s 248% 177% 26% 12% 2% -- -26% -36% -36%
sereal_dclone 6075/s 370% 274% 70% 51% 38% 35% -- -13% -14%
panda_fclone 6981/s 440% 329% 95% 73% 59% 55% 15% -- -1%
panda_clone 7041/s 445% 333% 96% 75% 60% 56% 16% 1% --
=cut
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment