2012-05-24 14 views
5

A pesar de todos los blogs conocidos sobre este tema, siempre dudo de algunos resultados y mis pruebas personales muestran que el estándar bien dicho no es el mejor.Rendimiento de declaración de variables en bucles en Actionscript 3

Declaración de variables dentro del bucle, para mantenerlos cerca de su alcance y hacerlo más rápido para llegar en el método, pero la asignación de más memoria o declarar fuera de la para alcance para salvar la asignación de memoria, pero aumentará el procesamiento de iterar en un caso distante.

Mis resultados muestran que el método B es más rápido (a veces), quiero saber el fondo alrededor de esto.

los resultados varían y no soy un gurú de poco brusher.

Entonces, ¿qué piensan ustedes al respecto?

Método 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

Método 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

Sería interesante ver las pruebas * reales * realizadas para ver si son válidas, repetibles y muestran lo que se afirma. Es difícil obtener micro benchmarks correctos (y solo los fragmentos de arriba no son adecuados). Hay * algún *, aunque generalmente inconsecuente, argumento para declarar variables dentro de ámbitos anidados (por ejemplo, * funciones anidadas *) y asignarles un valor para evitar buscar en la cadena [[scope]], pero eso es * diferente * caso que requiere un nuevo [[alcance]] a ser observado. –

+0

El método B es más rápido porque tiene menos novedades. Es la nueva declaración que se está tomando el tiempo aquí. –

Respuesta

8

tldr; son semánticamente equivalentes y funcionan de manera idéntica.

Sólo hay una variable llamada object en ambos casos presentados. ActionScript, como JavaScript, declaraciones de "elevación". Es decir, var es realmente solo una anotación con función de fondo. Esto difiere de C y Java donde se ha creado un nuevo ámbito (y, por lo tanto, una nueva variable) en el segundo caso.

No hay diferencia en AS, sin embargo. El motor trata eficazmente el segundo código idéntico al primero. (Dicho esto, yo prefiero a "mantener el var cerca" de donde se utiliza, mientras que la comprensión no es relevante para el alcance y no influye en el rendimiento.)

Ver Action Script 3.0: Variables y, la sección Alcance en particular:

el ámbito de una variable es el área de su código donde la variable se puede acceder por una referencia léxica ... en ActionScript 3.0, las variables siempre se asignan al ámbito de la función o clase que están declarados

Happy coding.

+0

Veo de una manera que el número de instancias variables es igual al número de bucles ya que la declaración *** var *** está dentro del cordón de encaje –

+0

@ ConradoSouza Eso está mal. Vea el enlace. 'var' ** no es una declaración ** (en el sentido C/Java) en AS/JavaScript. Es una anotación de función amplia. Es decir, se "levanta" y se aplica al alcance de la función. (Se llama técnicamente declaración, sin embargo, hago hincapié en que no "declara" nada cuando se ejecuta esa "línea"). –

+0

@ConradoSouza Este comportamiento se puede ver como, fuera del ciclo (incluso por encima de 'var object' line!), 'object' es accesible y tendrá el último valor asignado. –

10

El compilador AS3 mueve todas las declaraciones de variables a la parte superior del método, lo que se denomina elevación variable. Y el alcance mínimo para una variable es un método completo.Su método B es equivalente a lo siguiente:

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; 
} 

Tenga en cuenta que solo mueve la declaración hacia arriba, no la asignación asociada con esto. Esta es la razón por la que puede declarar una variable después de usarla. Por ejemplo, pruebe este código:

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

Esto compilará. Se debe a que este código es equivalente a:

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

Ésta es también la razón por la que obtendrá una advertencia declaración de variable duplicado con el siguiente código:

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

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

} 

El concepto de alcance variable en AS3, JS es diferente de C, C++, Java, etc.

+1

Taskinoor, su respuesta es correcta, pero su respuesta contiene más conocimiento técnico y es lo que estaba buscando, y probablemente cualquiera que se encuentre con esta pregunta lo estará buscando también. –

+5

@Conrado Souza, SO se trata de compartir el conocimiento y el aprendizaje a través de ayudar a los demás. Nunca se trata de ser aceptado o obtener una mejor reputación, son solo subproductos. Intenté hacerlo lo mejor posible, eso no significa que proporcioné la mejor respuesta. – taskinoor

+2

Me gusta más esta respuesta que la mía. Tengo mi +1. –