[Rio-pm] Performance

Eden Cardim edencardim em gmail.com
Sexta Fevereiro 20 16:48:45 PST 2009


2009/2/20 Fernando Oliveira <fernandocorrea em gmail.com>:
> pois é...
>
> perl -MBenchmark=cmpthese -e '
>
> @a = map {"a$_"."b"} 1 .. 150_000;
>
> @b = "a" .. "e";
>
> sub a{
>    for my $a (@a){
>       for my $b (@b){
>          next if $a =~ /^$b/;
>       }
>    }
> }

o next dessa subrotina vai pular pro próximo elemento do loop interno,
então claro que ela vai ser mais lenta do que a outra.

> sub b{
>    for my $a (@a){
>       next if $a =~ /^a/;
>       next if $a =~ /^b/;
>       next if $a =~ /^c/;
>       next if $a =~ /^d/;
>       next if $a =~ /^e/;
>    }
> }
>
>
> cmpthese(50, {a => \&a, b => \&b});
> '
>     s/iter     a     b
> a     3.40    --  -98%
> b 6.44e-02 5175%    --

Fiz uma outra análise comparando regexes constantes, precompiladas e
compiladas a cada iteração:

use Benchmark qw(cmpthese);

my @chars = ('a'..'z');
my @array = map { join '', map { $chars[int rand @chars] } (1) x 10 } (1) x 50;

my $constant_regexes = join "\n", map { "      next if /${_}/;" } @chars;
my $constant_regexes_sub = qq{
 sub {
   for(\@array) {
$constant_regexes
   }
 }
};

sub var_regexes {
 ELEM: for(@array) {
   for my $regex (@chars) {
     next ELEM if /$regex/;
   }
 }
}

sub compiled_regexes {
 my @compiled_regexes = map { qr/$_/ } @chars;
 ELEM: for(@array) {
   for my $regex (@compiled_regexes) {
     next ELEM if /$regex/;
   }
 }
}

cmpthese 100000 => {
 constant_regexes => eval $constant_regexes_sub,
 var_regexes      => \&var_regexes,
 compiled_regexes => \&compiled_regexes
};
__END__

resultado:

                   Rate      var_regexes compiled_regexes constant_regexes
var_regexes       2475/s               --             -48%             -94%
compiled_regexes  4744/s              92%               --             -89%
constant_regexes 41322/s            1570%             771%               --

--
  Eden Cardim       Need help with your Catalyst or DBIx::Class project?
 Code Monkey                    http://www.shadowcat.co.uk/catalyst/
Shadowcat Systems Ltd.  Want a managed development or deployment platform?
http://edenc.vox.com/            http://www.shadowcat.co.uk/servers/


Mais detalhes sobre a lista de discussão Rio-pm