[Cascavel-pm] Duvida Foreach

Nilson Santos Figueiredo Junior acid06 em gmail.com
Terça Dezembro 4 12:12:21 PST 2007


On Dec 4, 2007 2:41 PM, Luis Motta Campos <luismottacampos em yahoo.co.uk> wrote:
> > É raro usar um for C-style. Mesmo para iteradores numéricos, prefiro usar:
> >
> >     for my $i (0..$x) { }
> >
>
> Um comentario apenas: esta forma eh a menos eficiente em termos de
> memoria. se voce vai usar o formato do C, entao "abraca o capeta":
>
> for ( my $i = 0 ; $i <= $x; $i++ ) {}
>
> Esta eh a forma que melhor administra a tua memoria. isso faz diferenca
> especialmente quando teus intervalos de numeros sao grandes.

Em alguma versão do Perl 5.8.x foi introduzida uma otimização que não
faz mais com que o foreach utilizado para iterar sobre um range de
inteiros gerem uma lista temporária.

Observe:

  #!/usr/bin/perl
  use warnings;
  use strict;

  use Benchmark 'cmpthese';

  my $limit = 1000000;

  cmpthese(10, {
      c_style => sub { my $j = 0; for (my $i = 0; $i <= $limit; $i++)
{ $j++ } },
      foreach => sub { my $j = 0; for my $i (0..$limit) { $j++ } }
  } );

Na verdade, o foreach acaba sendo 25% mais rápido na minha máquina (perl 5.8.8).

            Rate c_style foreach
  c_style 5.12/s      --    -20%
  foreach 6.40/s     25%      --

O uso de memória é o mesmo em ambas as versões do código.

-Nilson Santos F. Jr.


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