[Rio-pm] hash como parametro

Gabriel Blum blum em pobox.com
Quarta Junho 30 13:27:27 PDT 2010


Muito obrigado Eden, realmente fiz um teste prático (rudimentar, mas
eficiente) e deu pra ver a diferença :-D

my @foo = qw(bar baz);

my $t = time;
sub {$_[1] = "quux"}->(@foo) foreach(1..$ARGV[0]);
print time-$t."s elapsed\n";

$t = time;
sub {$_[0]->[1] = "quux"}->(\@foo) foreach(1..$ARGV[0]);
print time-$t."s elapsed\n";

C:\>a.pl 30000000
22s elapsed
29s elapsed


2010/6/30 Eden Cardim <edencardim em gmail.com>

> >>>>> "Gabriel" == Gabriel Blum <blum em pobox.com> writes:
>
>    Gabriel> isso decorre da maneira que o perl passa parâmetros. Sugiro
>    Gabriel> vc passar a referência, que é bem mais eficiente
>    Gabriel> inclusive.
>
> Não é *bem* mais eficiente, só um pouco. Perl sempre faz passagem por
> referência implicitamente, através do array especial @_, que é um alias
> pra lista de argumentos, se você alterar o @_ diretamente, os argumentos
> originais serão modificados também. O que faz ser menos eficiente é o
> tipo de dados que você está passando, no caso de um hash não tem como
> saber em qual slot do @_ está o valor que você quer alterar, então você
> precisa re-mapear o hash, efetivamente criando uma "cópia rasa" dos
> valores, que é mais lento do que usar referências.
>
> Inclusive, acho que pra alguns casos é mais lento usar uma referência:
>
> perl -le'my @foo = qw(bar baz); sub {$_[1] = "quux"}->(@foo); print "@foo"'
> perl -le'my @foo = qw(bar baz); sub {$_[0]->[1] = "quux"}->(\@foo); print
> "@foo"'
>
> já que a segunda alternativa envolve três etapas adicionais: a
> criação/destruição da referência e a dereferenciação.
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20100630/5ae107e5/attachment.html>


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