2010-08-30 5 views
11

Citando PerlMonks: The difference between my and local,In che modo "my" è più veloce di "local" in Perl?

Ma nella vita reale, funzionano praticamente la stessa cosa? Sì. Una specie di. Quindi quando dovresti usarli?

Usa la mia quando si può (è più veloce di locale) ...

So che la lessicale vs differenza scoping dinamico tra my e local, come discusso in this SO thread, ma io non sono sicuro perché my è "più veloce".

Cosa intendiamo esattamente quando diciamo che una variabile my è più veloce di una variabile local in Perl?

+1

Essere un * eroe * locale - provare a leggere * il mio * codice. –

+12

Non utilizzare locale vs. mio perché uno è più veloce dell'altro; usa ciò che è più corretto per ciò che vuoi ottenere (di solito il mio). – ysth

+1

In altre parole: non contare solo il tempo impiegato da un programma per eseguire, ma soprattutto contare il tempo che impiega un programmatore per eseguire il debug e correggerlo. Il programmatore è molto più costoso del computer che esegue il programma. – reinierpost

risposta

19

L'utilizzo di local su una variabile indica che il suo stato precedente deve essere inserito in una pila da qualche parte e ripristinato di nuovo quando viene chiuso l'ambito locale. L'utilizzo di my su una variabile crea semplicemente una variabile completamente nuova che ombreggia la variabile precedente con lo stesso nome: la precedente è interamente non modificata e non deve essere salvata da nessuna parte. È semplicemente in agguato quando si esce dall'ambito locale ed è di nuovo visibile.

Questo push/popping a una pila richiede risorse; c'è un sacco di lavoro sotto il cofano per garantire che funzioni correttamente. (Considera casi come un'eccezione generata durante l'ambito locale o un gestore di segnali in esecuzione. Sono sicuro che tu possa pensare di più.)

Oltre ad essere più efficiente, l'utilizzo di my è molto più logico. Come programmatore che introduce una variabile locale $ pippo, non devi preoccuparti della ragione semantica per la precedente versione di $ pippo, quali dati potrebbero esserci già, o anche se ci fosse un $ pippo già creato. Se in qualche momento lungo la strada viene rimossa la dichiarazione precedente di $ pippo, il codice local $foo si interromperà, ma my $foo sarà perfettamente felice. Sii un buon programmatore e mantieni il tuo codice in pezzi ben incapsulati, il che significa usare l'ambito lessicale il più possibile. È abbastanza possibile scrivere una grande applicazione e non è mai necessario avere variabili del pacchetto/ambito globale, specialmente quando si utilizzano classi OO ben progettate.

+3

@Evan Carroll: no, usa una pila chiamata savestack – ysth

+8

In particolare c'è un "blocco grafico lessicale" che è già stato assegnato per ogni ambito lessicale su cui Perl mette il nuovo lessico. Quando esce l'oscilloscopio, il blocco dei graffi scompare. Inoltre, local() deve occuparsi della localizzazione e del ripristino dei singoli elementi di hash e di array ('locale $ h {chiave}'). Infine, le variabili legate sono trattate in modo speciale da local, i loro metodi FETCH e STORE vengono chiamati quando vengono localizzati e ripristinati. Qualunque cosa debba prendere in considerazione la possibilità di legare è più lenta perché deve controllare se una variabile è legata. – Schwern

12

local è probabilmente più lento a causa della necessità di salvare il vecchio valore, ma la velocità di local vs my non dovrebbe entrare nella discussione. Il risparmio di velocità è minimo:

  Rate local my 
local 7557305/s -- -2% 
my 7699334/s 2% -- 

e le caratteristiche dei due sono radicalmente differenti. I risultati sopra riportati provengono dal seguente benchmark:

#!/usr/bin/perl 

use strict; 
use warnings; 

use Benchmark; 

our $x; 

my %subs = (
    local => sub { 
     local $x = 42; 
     return $x; 
    }, 
    my => sub { 
     my $x = 42; 
     return $x; 
    } 
); 

for my $sub (keys %subs) { 
    print "$sub: ", $subs{$sub}(), "\n"; 
} 

Benchmark::cmpthese -1, \%subs; 
+3

La differenza di velocità diventerebbe molto più evidente quando introducete alcuni dei casi descritti da Schwern sotto la mia risposta. – Ether

Problemi correlati