[SP-pm] Duvida primaria
Nilson Santos Figueiredo Jr.
acid06 at gmail.com
Wed Oct 20 11:50:12 PDT 2010
2010/10/20 Eden Cardim <edencardim at gmail.com>:
> Nunca, jamais use qualquer tipo de construção do tipo switch. Use
> lookup tables como sugerido pelo Marcio Ferreira.
Usar given/when é *MUITO* mais rápido do que usar uma dispatch table,
por exemplo. E mesmo um lookup burro, ao invés de dispatch pra uma
função anônima ainda é 3x mais lento.
Exemplo de resultados de benchmark:
Rate dispatch lookup switch
dispatch 121116/s -- -77% -92%
lookup 524558/s 333% -- -67%
switch 1599278/s 1220% 205% --
Código segue abaixo (óbvio que o exemplo é simplista e se aumentar o
númerp de cláusulas do switch vai ficando cada vez mais lento, mas
ainda deve ser mais rápido pra muitos cases):
#!/usr/bin/perl
use warnings;
use strict;
use feature 'switch';
use Benchmark qw/cmpthese/;
sub dispatch {
my $var;
my %table = (
0 => sub { $var = "zero" },
1 => sub { $var = "um" },
2 => sub { $var = "dois" }
);
$table{ int rand 3 }();
return $var;
}
sub lookup {
my $var;
my %table = (
0 => "zero",
1 => "um",
2 => "dois"
);
$var = $table{ int rand 3 };
return $var;
}
sub switch {
my $var;
given ( int rand 3 ) {
when ( 0 ) { $var = "zero" }
when ( 1 ) { $var = "um" }
when ( 2 ) { $var = "dois" }
}
return $var;
}
cmpthese( -5, {
lookup => \&lookup,
dispatch => \&dispatch,
switch => \&switch
} );
-Nilson
More information about the SaoPaulo-pm
mailing list