#!/home/altblue/bin/perl #!/usr/bin/perl use warnings; use strict; use Benchmark qw(:all); use utf8; use Clone::PP qw(clone); use Encode; use Encode::JavaScript::UCS (); use JSON::XS (); use JSON (); use JSON::DWIW (); use JSON::Syck (); my $iterations = shift || -1; my $data = { str => 'şopârliţe', pi => 3.14, nul => undef, zero => 0, # BS, each module implements this in its own twisted way :( # tru => "\1", # fals => "\0", }; printf "\n\nIs \$data->{str} marked as UTF8? %s\n", Encode::is_utf8( $data->{str} ) ? 'yes' : 'no'; # Switch "standard" filehandles to utf8 for my $fh ( *{STDOUT}, *{STDERR}, *{STDIN} ) { binmode $fh, ':utf8'; } my %methods = ( 'JSON' => sub { JSON::to_json( clone($data) ); }, 'JSON::XS' => sub { Encode::decode_utf8( JSON::XS::encode_json( clone($data) ) ); }, 'JSON::XS(OOP)' => sub { JSON::XS->new->encode( clone($data) ); }, 'JSON::DWIW' => sub { JSON::DWIW->to_json( clone($data) ); }, 'JSON::Syck' => sub { local $JSON::Syck::ImplicitUnicode = 1; JSON::Syck::Dump( clone($data) ); }, ); my %methods_ucs = ( 'UCS/JSON' => sub { encode( 'JavaScript-UCS', JSON::to_json( clone($data) ) ); }, 'UCS/JSON::XS' => sub { encode( 'JavaScript-UCS', Encode::decode_utf8( JSON::XS::encode_json( clone($data) ) ) ); }, 'UCS/JSON::XS(OOP)' => sub { encode( 'JavaScript-UCS', JSON::XS->new->encode( clone($data) ) ); }, 'UCS/JSON::DWIW' => sub { encode( 'JavaScript-UCS', JSON::DWIW->to_json( clone($data) ) ); }, 'UCS/JSON::Syck' => sub { local $JSON::Syck::ImplicitUnicode = 1; encode( 'JavaScript-UCS', JSON::Syck::Dump( clone($data) ) ); }, ); #%methods = (%methods, %methods_ucs); for ( sort keys %methods ) { printf "%17s: %s\n", $_, &{ $methods{$_} }; } cmpthese( timethese( $iterations, \%methods ) );