The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;
use Benchmark qw/:all/;
use WWW::Form::UrlEncoded;
use WWW::Form::UrlEncoded::PP;
use URL::Encode::XS;
use Text::QueryString;


my @query_string = (
    "foo=bar",
    "foo=bar&bar=1",
    "foo=bar;bar=1",
    "foo=bar&foo=baz",
    "foo=bar&foo=baz&bar=baz",
    "foo_only",
    "foo&bar=baz",
    '%E6%97%A5%E6%9C%AC%E8%AA%9E=%E3%81%AB%E3%81%BB%E3%82%93%E3%81%94&%E3%81%BB%E3%81%92%E3%81%BB%E3%81%92=%E3%81%B5%E3%81%8C%E3%81%B5%E3%81%8C',
);

my $xs = Text::QueryString->new;

cmpthese(timethese(-1, {
    text_qs => sub {
        foreach my $qs (@query_string) {
            my @q = $xs->parse($qs);
        }
    },
    wwwform_xs => sub {
        foreach my $qs (@query_string) {
            my @q = WWW::Form::UrlEncoded::XS::parse_urlencoded($qs);
        }
    },
    wwwform_xs_ref => sub {
        foreach my $qs (@query_string) {
            my $q = WWW::Form::UrlEncoded::XS::parse_urlencoded_arrayref($qs);
        }
    },
    wwwform_pp => sub {
        foreach my $qs (@query_string) {
            my @q = WWW::Form::UrlEncoded::PP::parse_urlencoded($qs);
        }
    },
    urlencode_xs => sub {
        foreach my $qs (@query_string) {
            my $q = URL::Encode::XS::url_params_flat($qs);
        }
    },
}));


__END__
Benchmark: running text_qs, urlencode_xs, wwwform_pp, wwwform_xs, wwwform_xs_ref for at least 1 CPU seconds...
   text_qs:  1 wallclock secs ( 1.11 usr +  0.00 sys =  1.11 CPU) @ 51661.26/s (n=57344)
urlencode_xs:  1 wallclock secs ( 1.11 usr +  0.00 sys =  1.11 CPU) @ 96863.96/s (n=107519)
wwwform_pp:  1 wallclock secs ( 1.15 usr +  0.00 sys =  1.15 CPU) @ 10387.83/s (n=11946)
wwwform_xs:  2 wallclock secs ( 1.10 usr +  0.00 sys =  1.10 CPU) @ 86884.55/s (n=95573)
wwwform_xs_ref:  1 wallclock secs ( 1.06 usr +  0.00 sys =  1.06 CPU) @ 95466.98/s (n=101195)
                  Rate wwwform_pp text_qs wwwform_xs wwwform_xs_ref urlencode_xs
wwwform_pp     10388/s         --    -80%       -88%           -89%         -89%
text_qs        51661/s       397%      --       -41%           -46%         -47%
wwwform_xs     86885/s       736%     68%         --            -9%         -10%
wwwform_xs_ref 95467/s       819%     85%        10%             --          -1%
urlencode_xs   96864/s       832%     87%        11%             1%           --