Dato che i programmi di esempio che hai dato non fanno veramente nulla, è difficile darti una ragione specifica per cui un tipo di dichiarazione sarebbe meglio dell'altro. Come molti altri poster hanno sottolineato, dichiarando che la variabile nel ciclo crea una nuova variabile ogni volta. Nei tuoi esempi la creazione è ridondante, ma considera i seguenti esempi usando le chiusure.
my @closures;
my $jimmy;
for (1 .. 10) {
$jimmy = $_** 2;
push @closures, sub {print "$jimmy\n"};
}
e questo:
my @closures;
for (1 .. 10) {
my $jimmy = $_** 2;
push @closures, sub {print "$jimmy\n"};
}
In ogni caso il codice si accumula una serie di riferimenti al codice, ma nel primo esempio in quanto tutti i codici arbitri si riferiscono alla stessa $jimmy
ognuno stamperà 100 quando chiamato. Nel secondo esempio ogni codice ref stamperà un numero diverso (1, 4, 9, 16, 25, ...)
Quindi in questo caso la differenza di orario non ha molta importanza dato che i due blocchi di codice fanno molto cose differenti.
fonte
2010-07-23 21:33:26
In aggiunta alle risposte di Robert Greiner, i due posizionamenti di 'my' nel codice sono semanticamente diversi che potrebbero essere importanti nei programmi non giocattolo. – msw
Ricorda che, solo perché puoi ottimizzare un pezzo di codice, non significa che dovresti. Esegui il profilo dell'intera applicazione e verifica se il bit di codice che stai tentando di ottimizzare è un grosso pezzo del tuo tempo di elaborazione. Inoltre, prova a impostare obiettivi di performance globali e locali e, una volta raggiunti, interrompi l'ottimizzazione :) –
Se vuoi vedere un elenco delle operazioni extra che si verificano quando 'my' viene dichiarato all'interno del ciclo, puoi eseguire ognuna di esse gli script come questo e confrontano i diversi output: 'perl -MO = Conciso, -exec script.pl'. – FMc