FU
view release on metacpan or search on metacpan
$r .= "\n";
}
for my ($n, $yr) (builtin::indexed @$ys) {
my $x = $xs->[$n];
my ($y, $m, @ys) = @$yr;
$m ||= $y;
$r .= sprintf '%18s', $y;
for my $i (0..$#$xs) {
my $d = $data{"$id $xs->[$i] $y"};
$r .= $d && $d->{rate} ? sprintf '%10d/s', $d->{rate} : sprintf '%12s', '-';
}
$r .= "\n";
}
"$r\n"
}
$SIG{INT} = $SIG{HUP} = sub { exit };
END {
exit if @exec;
open my $F, '>FU/Benchmarks.pod' or die $!;
select $F;
while (<DATA>) {
s/^%/=/;
s#^:modules#join '', map sprintf("=item L<%s> %s\n\n", $_, $modules{$_}), sort keys %modules#e;
s#^:benches (.+)#join '', map fmtbench(@$_), grep $_->[0] =~ /$1/, @bench#e;
print;
}
for (sort keys %data) {
my $b = $data{$_};
print join("\t", map $_//'', @{$b}{qw/ id x y rate /})."\n";
}
}
sub def($id, $text, $xs, @ys) {
for my ($ya) (@ys) {
my($y, $m, @sub) = @$ya;
$m ||= $y;
for my($i, $x) (builtin::indexed @$xs) {
next if !$sub[$i];
my $d = "$id $x $y";
$data{$d} ||= { id => $id, x => $x, y => $y };
$d = $data{$d};
$d->{exists} = 1;
}
}
push @bench, [ $id, $text, $xs, \@ys ];
}
use FU::Util 'json_format', 'json_parse';
sub defjson($name, $canon, $text, $val) {
# Use similar options for fair comparisons.
my $cp = Cpanel::JSON::XS->new->allow_nonref->unblessed_bool->convert_blessed;
my $pp = JSON::PP->new->allow_nonref->core_bools->convert_blessed;
my $xs = JSON::XS->new->allow_nonref->boolean_values([false,true])->convert_blessed;
my $si = JSON::SIMD->new->allow_nonref->core_bools->convert_blessed;
my $c_cp = Cpanel::JSON::XS->new->allow_nonref->unblessed_bool->convert_blessed->canonical;
my $c_pp = JSON::PP->new->allow_nonref->core_bools->convert_blessed->canonical;
my $c_xs = JSON::XS->new->allow_nonref->boolean_values([false,true])->convert_blessed->canonical;
my $c_si = JSON::SIMD->new->allow_nonref->core_bools->convert_blessed->canonical;
my $enc = json_format $val;
def "json/$name", $text, [ 'Encode', $canon ? 'Canonical' : (), 'Decode' ],
[ 'JSON::PP', undef, sub { $pp->encode($val) }, $canon ? sub { $c_pp->encode($val) } : (), sub { $pp->decode($enc) } ],
[ 'JSON::Tiny', undef, sub { JSON::Tiny::to_json($val) }, $canon ? undef : (), sub { JSON::Tiny::from_json($enc) } ],
[ 'Cpanel::JSON::XS', undef, sub { $cp->encode($val) }, $canon ? sub { $c_cp->encode($val) } : (), sub { $cp->decode($enc) } ],
[ 'JSON::SIMD', undef, sub { $si->encode($val) }, $canon ? sub { $c_si->encode($val) } : (), sub { $si->decode($enc) } ],
[ 'JSON::XS', undef, sub { $xs->encode($val) }, $canon ? sub { $c_xs->encode($val) } : (), sub { $xs->decode($enc) } ],
[ 'FU::Util', 'FU', sub { json_format $val }, $canon ? sub { json_format $val, canonical => 1 } : (), sub { json_parse $enc } ];
}
# From JSON::XS POD.
defjson api => 1, 'API object from L<JSON::XS> documentation.',
[ map +{method => 'handleMessage', params => ['user1','we were just talking'], 'id' => undef, 'array' => [1,11,234,-5,1e5,1e7,1,0]}, 1..10 ];
defjson objs => 1, 'Object (small)', [ map +{ map +("string$_", 1), 'a'..'f' }, 0..100 ];
defjson objl => 1, 'Object (large)', { map +("string$_-something", 1), 'aa'..'zz' };
defjson obju => 1, 'Object (large, mixed unicode)', { map +("str\x{1234}g$_-some\x{85232}hing", 1), 'aa'..'zz' };
defjson ints => 0, 'Small integers', [ -5000..5000 ];
defjson intl => 0, 'Large integers', [ map { my $n=$_; map +($n+1<<$_), 10..60 } 1..10 ];
defjson strs => 0, 'ASCII strings', [ map +('hello, world', 'one more string', 'another string'), 1..100 ];
defjson stru => 0, 'Unicode strings', do { use utf8;
[ map +('ã°ãªã¶ã¤ã¢ã®æå® -LE FRUIT DE LA GRISAIA-', 'ð©', 'Я лÑÐ±Ð»Ñ Ð½ÑÑого не ÑобиÑи'), 1..50 ];
};
defjson stres => 0, 'String escaping (few)', [ map 'This string needs to "be escaped" a little bit', 1..100 ];
defjson strel => 0, 'String escaping (many)', [ map "This \" \\ needs \n\x41\x42\x43\x44 more", 1..100 ];
package BENCH::TUWFXML {
use TUWF::XML ':html5_', 'xml_string';
sub f($id) {
li_ class => $id % 2 ? 'one' : undef, '+', $id % 5 > 2 ? 'two' : undef, sub {
small_ '--'x($id % 50).' ' if $id % 3;
a_ href => "/$id",
class => $id % 7 > 2 ? 'another-class' : undef,
'+' => $id % 9 < 7 ? 'and-another-one' : undef,
style => "width: ${id}px",
$id;
};
}
sub t { xml_string sub { div_ sub { f $_ for (1..100) } } }
}
package BENCH::XMLWriter {
my $wr;
sub f($id) {
$wr->startTag(li => class => join(' ', $id % 2 ? 'one' : (), $id % 5 > 2 ? 'two' : ()));
$wr->dataElement(small => '--'x($id % 50).' ') if $id % 3;
$wr->dataElement(a => $id, href => "/$id", class => join(' ',
$id % 7 > 2 ? 'another-class' : (),
$id % 9 < 7 ? 'and-another-one' : ()
), style => "width: ${id}px");
$wr->endTag();
}
sub t {
$wr = XML::Writer->new(OUTPUT => \my $str, UNSAFE => 1);
$wr->startTag('div');
( run in 1.445 second using v1.01-cache-2.11-cpan-7fcb06a456a )