[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