ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/JSON-XS/eg/bench
Revision: 1.22
Committed: Tue Jan 19 01:02:19 2010 UTC (14 years, 5 months ago) by root
Branch: MAIN
CVS Tags: rel-4_0, rel-3_0, rel-4_01, rel-4_03, rel-4_02, rel-2_3, rel-4_0_00, rel-2_34, rel-2_32, rel-2_33, rel-2_31, rel-3_01, rel-3_02, rel-3_03, rel-3_04, rel-2_29, rel-2_28, HEAD
Changes since 1.21: +2 -2 lines
Log Message:
*** empty log message ***

File Contents

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