[Cascavel-pm] Legibilidade do map()... [Was: Duvida $dbh->prepare]
Nilson Santos Figueiredo Junior
acid06 em gmail.com
Sexta Janeiro 26 18:19:39 PST 2007
On 1/26/07, Solli Honorio <shonorio em gmail.com> wrote:
> Estilo sim, mas matar a gramática não :)... e os números mostram que devemos
> utilizar 'map' como "map" e 'foreach' como "foreach".
Note que seus números foram inflados artificialmente por causa da
forma artificial como você utilizou os recursos (não é comum
incrementar $_ e no map() isso traz conseqüências adversas). Observe a
diferença:
<code>
use Benchmark;
Benchmark::cmpthese( -5, {
'foreach' => sub { my $i = 0; foreach ( 1..1000 ) { $i++ } },
'map' => sub { my $i = 0; map { $i++ } ( 1..1000 ) },
});
</code>
<result>
Rate map foreach
map 5696/s -- -13%
foreach 6535/s 15% --
</result>
Desta maneira, o "foreach" é apenas 15% mais rápido na minha máquina,
contra 99% pelo seu teste anterior executado na minha máquina.
Por fim, num exemplo mais real ainda, pode-se observar que o map() é,
na verdade, marginalmente mais rápido. Se o código for alterado para:
<code>
use Benchmark;
my @ary = map { $_ * 2 } 1..1000;
Benchmark::cmpthese( -5, {
'foreach' => sub { my $i = 0; foreach ( @ary ) { $i+=$_ } },
'map' => sub { my $i = 0; map { $i+=$_ } @ary },
});
</code>
<result>
Rate foreach map
foreach 4762/s -- -2%
map 4850/s 2% --
</result>
Esse resultado aparentemente estranho acontece porque o "foreach"
possui uma otimização explícita para trabalhar com o operador de range
(1..1000, por exemplo), o que explica a vantagem de 15% sobre o map()
no primeiro teste, já que pra cada iteração, o map() tem de criar uma
lista de 1000 elementos e executar enquanto o foreach itera
diretamente. Mas, quando é utilizado uma array convencional essa
otimização não existe e ambos competem igualmente.
Por fim, é importante ressaltar que, mesmo o map() se mostrando
marginalmente mais rápido, o "foreach" é o correto a ser utilizado por
uma questão semântica. Tentar argumentar baseado em performance não é
a maneira correta de julgar estilos de linguagem.
-Nilson Santos F. Jr.
Mais detalhes sobre a lista de discussão Cascavel-pm