[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