Skip to content

Instantly share code, notes, and snippets.

@lbalker
Created October 28, 2015 21:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lbalker/79f3dbf315248ed3c257 to your computer and use it in GitHub Desktop.
Save lbalker/79f3dbf315248ed3c257 to your computer and use it in GitHub Desktop.
#!/usr/bin/perl
# http://idisk.mac.com/christian.hansen/Public/perl/serialize.pl
# see bottom of this script for benchmark results.
use strict;
use warnings;
use Benchmark qw[cmpthese timethis timestr];
use Getopt::Long qw[];
use UNIVERSAL::require qw[];
my $benchmarks = {
'Bencode' => {
deflate => sub { Bencode::bencode($_[0]) },
inflate => sub { Bencode::bdecode($_[0]) }
},
'Convert::Bencode' => {
deflate => sub { Convert::Bencode::bencode($_[0]) },
inflate => sub { Convert::Bencode::bdecode($_[0]) }
},
'Convert::Bencode_XS' => {
deflate => sub { Convert::Bencode_XS::bencode($_[0]) },
inflate => sub { Convert::Bencode_XS::bdecode($_[0]) }
},
'Data::Taxi' => {
deflate => sub { Data::Taxi::freeze($_[0]) },
inflate => sub { Data::Taxi::thaw($_[0]) },
},
'FreezeThaw' => {
deflate => sub { FreezeThaw::freeze($_[0]) },
inflate => sub { FreezeThaw::thaw($_[0]) },
},
'JSON' => {
deflate => sub { JSON->new->objToJson($_[0]) },
inflate => sub { JSON->new->jsonToObj($_[0]) },
},
'JSON::PC' => {
deflate => sub { JSON::PC::convert($_[0]) },
inflate => sub { JSON::PC::parse($_[0]) },
},
'JSON::Syck' => {
deflate => sub { JSON::Syck::Dump($_[0]) },
inflate => sub { JSON::Syck::Load($_[0]) },
default => 1
},
'Storable' => {
deflate => sub { Storable::nfreeze($_[0]) },
inflate => sub { Storable::thaw($_[0]) },
default => 1
},
'PHP::Serialization' => {
deflate => sub { PHP::Serialization::serialize($_[0]) },
inflate => sub { PHP::Serialization::unserialize($_[0]) }
},
'RPC::XML' => {
deflate => sub { RPC::XML::response->new($_[0]) },
inflate => sub { RPC::XML::Parser->new->parse($_[0]) },
packages => ['RPC::XML::Parser']
},
'YAML' => {
deflate => sub { YAML::Dump($_[0]) },
inflate => sub { YAML::Load($_[0]) },
},
'YAML::Syck' => {
deflate => sub { YAML::Syck::Dump($_[0]) },
inflate => sub { YAML::Syck::Load($_[0]) },
},
'XML::Simple' => {
deflate => sub { XML::Simple::XMLout($_[0]) },
inflate => sub { XML::Simple::XMLin($_[0]) },
},
'JSON::XS' => { deflate => sub { JSON::XS::encode_json($_[0]) },
inflate => sub { JSON::XS::decode_json($_[0]) },
default => 1 },
'Data::Dumper' => { deflate => sub { Data::Dumper->Dumper($_[0]) },
inflate => sub { eval $_[0] }, default => 1 },
};
my @benchmark = (); # package names of benchmarks to run
my $iterations = -1; # integer
my $benchmark_deflate = 1; # boolean
my $benchmark_inflate = 1; # boolean
my $output = 'chart'; # chart or time
my $width = 0;
my $results = { };
my $structure = {
array => [ 'a' .. 'j' ],
hash => { 'a' .. 'z' },
string => 'x' x 200
};
Getopt::Long::Configure( 'bundling' );
Getopt::Long::GetOptions(
'b|benchmark=s@' => sub {
if ( lc $_[1] eq 'all' ) {
return @benchmark = keys %{ $benchmarks };
}
if ( lc $_[1] eq 'default' ) {
return @benchmark = grep { $benchmarks->{ $_ }->{default} } keys %{ $benchmarks };
}
if ( exists $benchmarks->{ $_[1] } ) {
return push( @benchmark, $_[1] );
}
die "Unknown benchmark '$_[1]'.\n";
},
'deflate!' => \$benchmark_deflate,
'inflate!' => \$benchmark_inflate,
'i|iterations=i' => \$iterations,
'o|output=s' => \$output,
's|structure=s' => sub {
die "Structure option requires YAML.\n"
unless YAML->require;
$structure = YAML::LoadFile( $_[1] );
}
) or exit 1;
@benchmark = grep { $benchmarks->{ $_ }->{default} } keys %{ $benchmarks }
unless @benchmark;
$width = width(@benchmark);
print "\nModules\n";
BENCHMARK:
foreach my $package ( sort @benchmark ) {
my $benchmark = $benchmarks->{$package};
my @packages = ( $package, @{ $benchmark->{packages} || [] } );
$_->require or next BENCHMARK for @packages;
my $deflate = $benchmark->{deflate};
my $inflate = $benchmark->{inflate};
printf( "%-${width}s : %s\n", $package, $package->VERSION );
$results->{deflate}->{$package} = time_deflate( $deflate, $inflate )
if $benchmark_deflate;
$results->{inflate}->{$package} = time_inflate( $deflate, $inflate )
if $benchmark_inflate;
}
output( 'Deflate', $output, $results->{deflate} )
if $benchmark_deflate;
output( 'Inflate', $output, $results->{inflate} )
if $benchmark_inflate;
sub output {
my $title = shift;
my $output = shift;
printf( "\n%s\n", $title );
return ( $output eq 'time' ) ? &output_time : &output_chart;
}
sub output_chart {
my $results = shift;
cmpthese($results);
}
sub output_time {
my $results = shift;
foreach my $title ( sort keys %{ $results } ) {
printf( "%-${width}s %s\n", $title, timestr( $results->{ $title } ) );
}
}
sub time_deflate {
my ( $deflate, $inflate ) = @_;
return timethis( $iterations, sub { &$deflate($structure) }, '', 'none' );
}
sub time_inflate {
my ( $deflate, $inflate ) = @_;
my $deflated = &$deflate($structure);
return timethis( $iterations, sub { &$inflate($deflated) }, '', 'none' );
}
sub width {
return length( ( sort { length $a <=> length $b } @_ )[-1] );
}
__DATA__
Modules
Bencode : 1.0
Convert::Bencode : 1.03
Convert::Bencode_XS : 0.03
Data::Taxi : 0.94
FreezeThaw : 0.43
JSON : 1.05
JSON::PC : 0.01
JSON::Syck : 0.12
PHP::Serialization : 0.27
RPC::XML : 1.35
Storable : 2.15
XML::Simple : 2.14
YAML : 0.57
YAML::Syck : 0.44
Deflate
Rate YAML Data::Taxi XML::Simple PHP::Serialization JSON RPC::XML YAML::Syck Bencode JSON::Syck FreezeThaw Convert::Bencode Storable Convert::Bencode_XS JSON::PC
YAML 100/s -- -82% -90% -92% -92% -93% -96% -97% -97% -97% -97% -98% -99% -99%
Data::Taxi 549/s 449% -- -43% -56% -57% -61% -79% -81% -81% -82% -85% -90% -95% -96%
XML::Simple 962/s 862% 75% -- -23% -25% -32% -63% -66% -67% -69% -74% -82% -92% -92%
PHP::Serialization 1244/s 1144% 126% 29% -- -3% -12% -52% -57% -57% -60% -67% -77% -89% -90%
JSON 1285/s 1185% 134% 34% 3% -- -9% -50% -55% -56% -58% -66% -76% -89% -90%
RPC::XML 1414/s 1314% 158% 47% 14% 10% -- -45% -51% -51% -54% -62% -74% -88% -89%
YAML::Syck 2570/s 2470% 368% 167% 107% 100% 82% -- -10% -11% -17% -32% -52% -78% -79%
Bencode 2871/s 2771% 423% 198% 131% 123% 103% 12% -- -1% -7% -24% -46% -75% -77%
JSON::Syck 2899/s 2799% 428% 201% 133% 126% 105% 13% 1% -- -6% -23% -46% -75% -77%
FreezeThaw 3086/s 2986% 462% 221% 148% 140% 118% 20% 7% 6% -- -18% -42% -73% -75%
Convert::Bencode 3759/s 3659% 585% 291% 202% 193% 166% 46% 31% 30% 22% -- -30% -68% -70%
Storable 5346/s 5246% 874% 456% 330% 316% 278% 108% 86% 84% 73% 42% -- -54% -57%
Convert::Bencode_XS 11585/s 11485% 2010% 1104% 832% 802% 719% 351% 304% 300% 275% 208% 117% -- -7%
JSON::PC 12401/s 12301% 2159% 1189% 897% 865% 777% 382% 332% 328% 302% 230% 132% 7% --
Inflate
Rate YAML XML::Simple PHP::Serialization Data::Taxi JSON Convert::Bencode Bencode FreezeThaw Convert::Bencode_XS RPC::XML YAML::Syck JSON::Syck JSON::PC Storable
YAML 83.3/s -- -60% -72% -79% -83% -86% -87% -91% -93% -93% -97% -98% -99% -99%
XML::Simple 210/s 152% -- -28% -46% -56% -65% -68% -78% -81% -81% -93% -94% -97% -99%
PHP::Serialization 293/s 252% 40% -- -25% -39% -51% -56% -69% -74% -74% -91% -92% -96% -98%
Data::Taxi 391/s 369% 86% 33% -- -18% -35% -41% -59% -65% -66% -88% -89% -95% -98%
JSON 478/s 473% 128% 63% 22% -- -21% -28% -50% -57% -58% -85% -87% -94% -97%
Convert::Bencode 602/s 622% 187% 105% 54% 26% -- -10% -37% -46% -47% -81% -83% -93% -96%
Bencode 666/s 699% 217% 127% 70% 39% 11% -- -30% -41% -41% -79% -81% -92% -96%
FreezeThaw 948/s 1037% 351% 223% 142% 98% 58% 42% -- -15% -16% -70% -73% -89% -94%
Convert::Bencode_XS 1120/s 1244% 434% 282% 186% 134% 86% 68% 18% -- -1% -64% -68% -86% -93%
RPC::XML 1135/s 1261% 440% 287% 190% 137% 89% 70% 20% 1% -- -64% -68% -86% -93%
YAML::Syck 3131/s 3657% 1391% 968% 701% 555% 420% 370% 230% 179% 176% -- -12% -62% -81%
JSON::Syck 3548/s 4157% 1590% 1110% 807% 643% 490% 433% 274% 217% 213% 13% -- -57% -79%
JSON::PC 8270/s 9824% 3840% 2720% 2015% 1631% 1275% 1142% 773% 638% 629% 164% 133% -- -50%
Storable 16592/s 19810% 7804% 5557% 4142% 3373% 2658% 2391% 1651% 1381% 1362% 430% 368% 101% --
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment