ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/JSON-XS/eg/bench
(Generate patch)

Comparing JSON-XS/eg/bench (file contents):
Revision 1.4 by root, Fri Mar 23 17:48:59 2007 UTC vs.
Revision 1.22 by root, Tue Jan 19 01:02:19 2010 UTC

1#!/opt/bin/perl 1#!/opt/bin/perl
2 2
3# Usage: bench json-file 3# Usage: bench json-file
4 4
5# which modules to test (JSON::PP usually excluded because its so slow)
6my %tst = (
7# "JSON" => ['JSON::encode_json $perl' , 'JSON::decode_json $json'],
8 "JSON::PP" => ['$pp->encode ($perl)' , '$pp->decode ($json)'],
9 "JSON::DWIW/FJ" => ['$dwiw->to_json ($perl)' , '$dwiw->from_json ($json)'],
10 "JSON::DWIW/DS" => ['$dwiw->to_json ($perl)' , 'JSON::DWIW::deserialize $json'],
11# "JSON::PC" => ['$pc->convert ($perl)' , '$pc->parse ($json)'],
12 "JSON::Syck" => ['JSON::Syck::Dump $perl' , 'JSON::Syck::Load $json'],
13 "JSON::XS" => ['encode_json $perl' , 'decode_json $json'],
14 "JSON::XS/2" => ['$xs2->encode ($perl)' , '$xs2->decode ($json)'],
15 "JSON::XS/3" => ['$xs3->encode ($perl)' , '$xs3->decode ($json)'],
16 "Storable" => ['Storable::nfreeze $perl' , 'Storable::thaw $pst'],
17);
18
5use JSON; 19use JSON ();
6use JSON::DWIW; 20use JSON::DWIW;
7use JSON::PC; 21use JSON::PC;
8use JSON::XS; 22use JSON::PP ();
23use JSON::XS qw(encode_json decode_json);
9use JSON::Syck; 24use JSON::Syck;
25use Storable ();
10 26
11use Time::HiRes; 27use Time::HiRes;
12use List::Util; 28use List::Util;
13 29
14use utf8; 30use utf8;
15 31
16my $dwiw = new JSON::DWIW; 32my $dwiw = new JSON::DWIW;
17my $pc = new JSON::PC; 33my $pc = new JSON::PC;
34my $pp = JSON::PP->new->max_depth (512);
18my $xs = JSON::XS->new->pretty (1)->canonical (1); 35my $xs2 = JSON::XS->new->utf8->pretty->canonical;
36my $xs3 = JSON::XS->new->utf8->shrink;
19 37
20my $json; # the test string 38my $json; # the test string
21 39
22local $/; 40local $/;
23$json = <>; 41$json = <>;
24 42
25# $json = to_json [join "", map +(chr rand 255), 0..8191]; 43# fix syck-brokenised stuff
44#$json = JSON::XS->new->ascii(1)->encode (JSON::Syck::Load $json);
45
46#srand 0; $json = JSON::XS->new->utf8(1)->ascii(0)->encode ([join "", map +(chr rand 255), 0..2047]);
26 47
27#if (1) { 48#if (1) {
28# use Storable; 49# use Storable;
29# open my $fh, "<:unix", "/opt/crossfire/share/cfserver/faces" or die "$!"; 50# open my $fh, "<:unix", "/opt/crossfire/share/cfserver/faces" or die "$!";
30# my $faces = Storable::thaw do { <$fh> }; 51# my $faces = Storable::thaw do { <$fh> };
32# open my $fh2, ">:unix", "faces.json" or die "$!"; 53# open my $fh2, ">:unix", "faces.json" or die "$!";
33# print $fh2 $json; 54# print $fh2 $json;
34# warn length $json; 55# warn length $json;
35#} 56#}
36 57
37my %tst = (
38 "JSON" => ['objToJson $perl' , 'jsonToObj $json'],
39 "JSON::DWIW" => ['$dwiw->to_json ($perl)', '$dwiw->from_json ($json)'],
40 "JSON::PC" => ['$pc->convert ($perl)' , '$pc->parse ($json)'],
41 "JSON::Syck" => ['JSON::Syck::Dump $perl', 'JSON::Syck::Load $json'],
42 "JSON::XS" => ['to_json $perl' , 'from_json $json'],
43 "JSON::XS/2" => ['$xs->encode ($perl)' , '$xs->decode ($json)'],
44);
45
46sub bench($) { 58sub bench($) {
47 my ($code) = @_; 59 my ($code) = @_;
48 60
49 my $perl = jsonToObj $json; 61 my $pst = Storable::nfreeze JSON::XS::decode_json $json; # seperately decode as storable stringifies :/
50 my $count = 20; 62 my $perl = JSON::XS::decode_json $json;
51 my $times = 15;
52 63
53 my $cent = eval "sub { " . (join ";", ($code) x $count) . "}"; 64 my $count = 5;
65 my $times = 200;
66
67 my $cent = eval "sub { my \$t = Time::HiRes::time; " . (join ";", ($code) x $count) . "; Time::HiRes::time - \$t }";
54 $cent->(); 68 $cent->();
55 69
56 my @meas; 70 my $min = 1e99;
57 71
58 while () { 72 for (1..$times) {
59 push @meas, Time::HiRes::time;
60 $cent->(); 73 my $t = $cent->();
61 $meas[-1] = Time::HiRes::time - $meas[-1];
62 74
63 my $mean = (List::Util::sum @meas) / @meas; 75 $min = $t if $t < $min;
64 if (@meas >= $times) {
65 @meas = grep $_ > $mean * 0.9 && $_ < $mean * 1.1, @meas;
66 my @meas = grep $_ > $mean * 0.9999 && $_ < $mean * 1.1111, @meas;
67 if (@meas >= $times) {
68 return $count / $mean;
69 }
70 }
71 } 76 }
77
78 return $count / $min;
72} 79}
73 80
74printf "%-10s | %10s | %10s |\n", "module", "encode", "decode"; 81printf "%-13s | %10s | %10s |\n", "module", "encode", "decode";
75printf "-----------|------------|------------|\n"; 82printf "--------------|------------|------------|\n";
76for my $module (sort keys %tst) { 83for my $module (sort keys %tst) {
77 my $enc = bench $tst{$module}[0]; 84 my $enc = bench $tst{$module}[0];
78 my $dec = bench $tst{$module}[1]; 85 my $dec = bench $tst{$module}[1];
79 86
80 printf "%-10s | %10.3f | %10.3f |\n", $module, $enc, $dec; 87 printf "%-13s | %10.3f | %10.3f |\n", $module, $enc, $dec;
81} 88}
82printf "-----------+------------+------------+\n"; 89printf "--------------+------------+------------+\n";
83 90

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines