-
-
Save lbalker/79f3dbf315248ed3c257 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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