[Cascavel-pm] [Spam] Re: [Spam] Re: PrincipaisContribuidoresCascavelPM
Nelson Ferraz
nferraz em gmail.com
Segunda Maio 28 09:15:41 PDT 2007
>> Esta não é uma justificativa muito boa, pois, em geral, o tempo de
>> alocar e desalocar a variável tem um impacto muito menor do que
>> *qualquer outra coisa* que você faça a seguir.
>
> Talvez não no caso dele, mas se houvessem muitas iterações(muitas
> mesmo), você há de concordar que é
> desnecessário alocar variáveis dentro de iterações...
Aí está o seu engano: *não importa o número de iterações*, se você
tiver *qualquer coisa útil* dentro do loop, o impacto da otimização
será desprezível.
Experimente:
use Benchmark qw ':all';
cmpthese(
1_000,
{
'my_inside' => 'for(1..10_000) { my $i = foo($_); }',
'my_outside' => 'my $i; for(1..10_000) { $i = foo($_); }',
}
);
sub foo {
my $i = shift;
return $i++;
}
Resultado:
Rate my_inside my_outside
my_inside 130/s -- -1%
my_outside 131/s 1% --
Ou seja: neste exemplo simples, em que não temos nenhuma chamada
realmente lenta dentro do loop, podemos dizer que a diferença é
desprezível.
>> No exemplo em questão, onde temos uma chamada realmente lenta dentro
>> do loop, pode-se dizer que este tempo é desprezível.
>
> Novamente, no caso dele não... por isso eu disse 'evite', e não
> 'não use'...
O exemplo demonstra o caso geral, em que o conselho não se aplica.
Mas é claro que o conselho se aplica a algumas situações,
nomeadamente quando o seu loop não faz nada. Nesse caso a
"otimização" poderia trazer um impressionante ganho de 10 a 20%. Isso
mesmo: 10 a 20% mais execuções de um loop vazio!
É pena que este ganho não escala, e quanto mais coisa você fizer
dentro do loop, menor será o ganho, até o ponto em que ele se tornar
praticamente nulo. (E como vimos no benchmark, basta uma chamada a
uma subrotina simples para que o ganho se torne desprezível.)
Resta saber se esta forma de estruturar o código aumenta ou prejudica
a legibilidade do programa.
>> Declare as variáveis no menor escopo possível, de forma que elas não
>> sejam usadas por mais tempo do que o necessário (tanto do ponto de
>> vista do computador, quanto do programador -- ao restringir o escopo,
>> você deixa de se preocupar com os efeitos colaterais de uma
>> variável).
>
> Pra mim sempre vai ser no mínimo esquisito alocar variáveis dentro
> de iterações.
Se você acredita que separar a declaração do seu uso de uma variável
torna seus scripts mais legíveis... vá em frente.
Eu pessoalmente discordo: as variáveis deveriam ter o menor escopo
necessário, para que nós possamos "esquecer" delas onde não são
necessárias.
Mas esta é apenas a minha opinião...
[]s
Nelson
Mais detalhes sobre a lista de discussão Cascavel-pm