[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