#!/opt/bin/perl
my
%tst
= (
"JSON::PP"
=> [
'$pp->encode ($perl)'
,
'$pp->decode ($json)'
],
"JSON::DWIW/FJ"
=> [
'$dwiw->to_json ($perl)'
,
'$dwiw->from_json ($json)'
],
"JSON::DWIW/DS"
=> [
'$dwiw->to_json ($perl)'
,
'JSON::DWIW::deserialize $json'
],
"JSON::Syck"
=> [
'JSON::Syck::Dump $perl'
,
'JSON::Syck::Load $json'
],
"JSON::XS"
=> [
'encode_json $perl'
,
'decode_json $json'
],
"JSON::XS/2"
=> [
'$xs2->encode ($perl)'
,
'$xs2->decode ($json)'
],
"JSON::XS/3"
=> [
'$xs3->encode ($perl)'
,
'$xs3->decode ($json)'
],
"Storable"
=> [
'Storable::nfreeze $perl'
,
'Storable::thaw $pst'
],
);
use
JSON::XS
qw(encode_json decode_json)
;
my
$dwiw
= new JSON::DWIW;
my
$pc
= new JSON::PC;
my
$pp
= JSON::PP->new->max_depth (512);
my
$xs2
= JSON::XS->new->utf8->pretty->canonical;
my
$xs3
= JSON::XS->new->utf8->shrink;
my
$json
;
local
$/;
$json
= <>;
sub
bench($) {
my
(
$code
) =
@_
;
my
$pst
= Storable::nfreeze JSON::XS::decode_json
$json
;
my
$perl
= JSON::XS::decode_json
$json
;
my
$count
= 5;
my
$times
= 200;
my
$cent
=
eval
"sub { my \$t = Time::HiRes::time; "
. (
join
";"
, (
$code
) x
$count
) .
"; Time::HiRes::time - \$t }"
;
$cent
->();
my
$min
= 1e99;
for
(1..
$times
) {
my
$t
=
$cent
->();
$min
=
$t
if
$t
<
$min
;
}
return
$count
/
$min
;
}
printf
"%-13s | %10s | %10s |\n"
,
"module"
,
"encode"
,
"decode"
;
printf
"--------------|------------|------------|\n"
;
for
my
$module
(
sort
keys
%tst
) {
my
$enc
= bench
$tst
{
$module
}[0];
my
$dec
= bench
$tst
{
$module
}[1];
printf
"%-13s | %10.3f | %10.3f |\n"
,
$module
,
$enc
,
$dec
;
}
printf
"--------------+------------+------------+\n"
;