FU

 view release on metacpan or  search on metacpan

bench.PL  view on Meta::CPAN

        $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 )