2012-05-24 14 views
5

Nonostante tutti i blog noti su questo problema, dubito sempre di alcuni risultati e i miei test personali mostrano che lo standard ben detto non è il migliore.Dichiarazione dichiarazione dichiarazione su loop in Actionscript 3

Dichiarazione variabile all'interno del ciclo, per tenerli vicino alla sua portata e renderlo più veloce da raggiungere con il metodo ma ripartendo più memoria o dichiarare fuori del per portata salvare allocazione di memoria ma aumentare elaborazione per iterare in un caso lontano.

I miei risultati mostrano che il metodo B è più veloce (a volte), voglio conoscere lo sfondo attorno a questo.

i risultati variano e non sono un guru del bit-brusher.

Allora, cosa ne pensate voi ragazzi?

Metodo A

var object:Object = new Object(); 
var loop:int = 100000 
for (var i:int = 0; i < loop; i++) 
{ 
    object = new Object(); 
    object.foo = foo; 
    object.bar = bar; 
} 

O

Metodo B

var loop:int = 100000 
for (var i:int = 0; i < loop; i++) 
{ 
    var object:Object = new Object() 
    object.foo = foo; 
    object.bar = bar; 
} 
+0

Sarebbe interessante vedere i test * effettivi * eseguiti per vedere se sono validi, ripetibili e mostrano cosa viene affermato. È difficile ottenere dei benchmark corretti (e solo i frammenti di cui sopra non sono adeguati). Esiste * qualche *, anche se in genere non pertinente, argomento per dichiarare le variabili all'interno degli ambiti nidificati (ad esempio * funzioni nidificate *) e assegnare loro un valore per evitare la ricerca nella catena [[scope]], ma questo è * diverso * caso che richiede un nuovo [[ambito]] da osservare. –

+0

Il metodo B è più veloce perché contiene meno novità. È la nuova affermazione che sta prendendo il tempo qui. –

risposta

8

TLDR; sono semanticamente equivalenti e si comportano in modo identico.

C'è solo una variabile chiamata object in entrambi casi presentati. ActionScript, come JavaScript, dichiarazioni "montate". Cioè, var è in realtà solo un'annotazione con ambito funzionale. Questo differisce da C e Java dove un nuovo ambito (e quindi una nuova variabile) sarebbe nel secondo caso.

Non c'è alcuna differenza in AS, tuttavia. Il motore tratta efficacemente il il 2 ° codice identico al primo. (Detto questo, io preferisco a "mantenere la var vicino" a cui viene utilizzato, mentre la comprensione non è rilevante per la portata e ha alcuna incidenza sulla prestazione.)

Vedi Action Script 3.0: Variables e, la sezione Scope in particolare:

l'ambito di una variabile è l'area del codice in cui la variabile è possibile accedere mediante un riferimento lessicale ... in ActionScript 3.0, variabili sono sempre assegnato l'ambito della funzione o classe quali sono dichiarati.

Felice codifica.

+0

Vedo in un modo che il numero di istanze variabili è uguale al numero di cicli poiché la dichiarazione *** var *** si trova all'interno del merletto del loop –

+0

@ConradoSouza Questo è sbagliato. Vedi il link. 'var' ** non è una dichiarazione ** (nel senso C/Java) in AS/JavaScript. È un'annotazione a livello di funzione. Cioè, è "sollevato" e si applica all'ambito della funzione. (Si chiama tecnicamente una dichiarazione, tuttavia, faccio notare che non "dichiara" nulla quando quella "linea viene eseguita".) –

+0

@ConradoSouza Questo comportamento può essere visto come, al di fuori del ciclo (anche sopra il 'var object' line!), 'object' è accessibile e avrà l'ultimo valore assegnato. –

10

Il compilatore AS3 sposta tutte le dichiarazioni delle variabili nella parte superiore del metodo che si chiama sollevamento variabile. E l'ambito minimo per una variabile è un metodo completo.Il tuo metodo B è equivalente al seguente:

var loop:int = 100000; 
var i:int; 
var object:Object; 
for (i = 0; i < loop; i++) { 
    object = new Object(); 
    object.foo = foo; 
    object.bar = bar; 
} 

Si noti che si sposta solo la dichiarazione, non l'assegnazione associata con questo. Questo è il motivo per cui puoi dichiarare una variabile dopo averla usata. Per esempio prova questo codice:

trace(a); 
var a:int = 10; 
trace(a); 

Questo verrà compilato. È perché questo codice è equivalente di:

var a:int; 
trace(a); 
a = 10; 
trace(a); 

Questa è anche la ragione per cui si ottiene un duplicato avvertimento dichiarazione di variabile con il seguente codice:

for (var i:int = 0; i < m; i++) { 

} 
for (var i:int = 0; i < n; i++) { // i is already declared once 

} 

Il concetto di portata variabile in AS3, JS è diverso da quello di C, C++, Java ecc.

+1

Taskinoor, la tua risposta è giusta come prima, tuttavia, la sua risposta contiene più conoscenze tecniche ed è quello che stavo cercando, e probabilmente anche chiunque ne venga a questa domanda lo cercherà. –

+5

@Conrado Souza, SO riguarda la condivisione della conoscenza e dell'apprendimento attraverso l'aiuto reciproco. Non si tratta mai di essere accettati o di ottenere una reputazione più elevata, sono solo sottoprodotti. Ho fatto del mio meglio, questo non significa che ho fornito la risposta migliore. – taskinoor

+2

Mi piace questa risposta meglio della mia, però. Ho il mio +1. –

Problemi correlati