En AS3, creo que debe inicializar todas las variables fuera de los bucles para aumentar el rendimiento. ¿Es este el caso con JavaScript también? ¿Cuál es mejor / más rápido / mejor práctica?
var value = 0;
for (var i = 0; i < 100; i++)
{
value = somearray[i];
}
o
for (var i = 0 ; i < 100; i++)
{
var value = somearray[i];
}
javascript
performance
davivid
fuente
fuente
Respuestas:
No hay absolutamente ninguna diferencia en significado o rendimiento, en JavaScript o ActionScript.
var
es una directiva para el analizador, y no un comando ejecutado en tiempo de ejecución. Si un identificador particular se ha declaradovar
una vez o más en cualquier parte del cuerpo de una función (*), todo uso de ese identificador en el bloque se referirá a la variable local. No importa sivalue
se declara que estávar
dentro del bucle, fuera del bucle o ambos.En consecuencia, debe escribir lo que le resulte más legible. No estoy de acuerdo con Crockford en que poner todos los vars en la parte superior de una función siempre es lo mejor. Para el caso en el que una variable se usa temporalmente en una sección de código, es mejor declarar
var
en esa sección, por lo que la sección es independiente y se puede copiar y pegar. De lo contrario, copie y pegue unas pocas líneas de código en una nueva función durante la refactorización, sin seleccionar y mover por separado lo asociadovar
, y obtendrá un global accidental.En particular:
Crockford le recomendará que elimine el segundo
var
(o elimine ambosvar
sy haga lovar i;
anterior), y jslint se quejará de esto. Pero en mi opinión, es másvar
fácil mantener ambos s, manteniendo todo el código relacionado juntos, en lugar de tener un bit de código adicional y fácil de olvidar en la parte superior de la función.Personalmente, tiendo a declarar como
var
la primera asignación de una variable en una sección de código independiente, si hay otro uso separado del mismo nombre de variable en alguna otra parte de la misma función. Para mí, tener que declararvar
es una verruga JS indeseable (hubiera sido mejor tener las variables predeterminadas a locales); No veo como mi deber duplicar las limitaciones de [una revisión anterior de] ANSI C en JavaScript también.(*: excepto en cuerpos de funciones anidadas)
fuente
var
solo se use en la parte superior de una función es solo pedir la creación accidental de variables globales. Y tener una masa de variables no relacionadas, todas declaradas en un punto, carece de sentido semántico, especialmente cuando algunas de esas variables pueden terminar sin ser utilizadas.En teoría, no debería hacer ninguna diferencia en JavaScript, ya que el lenguaje no tiene alcance de bloque, sino solo alcance de función.
No estoy seguro sobre el argumento del rendimiento, pero Douglas Crockford todavía recomienda que las
var
declaraciones sean las primeras en el cuerpo de la función. Citando las convenciones de código para el lenguaje de programación JavaScript :Creo que tiene un punto, como puede ver en el siguiente ejemplo. Declarar las variables en la parte superior de la función no debe confundir a los lectores a pensar que la variable
i
se mantiene en el ámbito delfor
bloque de bucle:fuente
ecma- / javascript
las aumentará en tiempo de ejecución. Eso se llama "elevación". Entonces no debería haber ninguna diferencia.let
afectan los ES6 esta respuesta?El
ECMA-/Javascript
lenguajehoists
cualquier variable que se declara en cualquier lugar en la parte superior de una función Eso se debe a que esta lengua no tienenfunction scope
y que no tienenblock scope
como muchos otros, C-como las lenguas.Eso también se conoce como
lexical scope
.Si declaras algo como
Esto llega
hoisted
a:Por lo tanto, no hace ninguna diferencia en el rendimiento (pero corrígeme si estoy totalmente equivocado aquí).
Un argumento mucho mejor para no declarar una variable en otro lugar que no sea la parte superior de una función es la legibilidad . Declarar una variable dentro de a
for-loop
podría llevar a la suposición errónea de que solo se puede acceder a esta variable dentro del cuerpo del bucle, lo cual es totalmente incorrecto . De hecho, puede acceder a esa variable en cualquier lugar dentro del alcance actual.fuente
let
afectan los ES6 esta respuesta?El próximo año, todos los navegadores tendrán motores JS que precompilarán el código, por lo que la diferencia de rendimiento (que proviene de analizar el mismo bloque de código una y otra vez más la ejecución de la asignación) debería ser insignificante.
Además, nunca optimice el rendimiento a menos que sea necesario. Mantener variables cerca del lugar donde las necesita la primera vez mantiene limpio su código. En el lado negativo, las personas que están acostumbradas a los idiomas con ámbitos de bloque podrían estar confundidas.
fuente
Otra consideración, ahora que tenemos
let
yconst
en ES2015, es que ahora puede abarcar variables específicamente para el bloque de bucle. Entonces, a menos que necesite la misma variable fuera del bucle (o si cada iteración depende de una operación realizada a esa variable en la iteración anterior), probablemente sea preferible hacer esto:fuente
Acabo de hacer una prueba simple en Chrome. Pruebe el violín en su navegador y vea los resultados.
El resultado es que la última prueba dura ~ 8 segundos y las 2 anteriores son solo ~ 2 segundos. Muy repetible e independientemente del orden.
Entonces, esto me demuestra que uno siempre debe declarar los vars fuera del ciclo. El caso curioso para mí es el primero donde declaro
i
en la declaración for (). Esta parece ser tan rápida como la segunda prueba en la que pre-declaro el índice.fuente
var
que declara como una variable global que ser global de todos modos.JavaScript es un lenguaje escrito en la parte inferior por C o C ++, no estoy muy seguro de cuál es. Y uno de sus propósitos es salvar el placer de manejar la memoria interna. Incluso en C o C ++, no tendrá que preocuparse por si consumirá muchos recursos cuando las variables se declaren dentro de un bucle. ¿Por qué deberías preocuparte en JavaScript?
fuente
Bueno, eso depende de lo que intente lograr ... si se
value
supone que es solo una variable temporal dentro del bloque de bucle, entonces es mucho más claro usar la segunda forma. También es más lógico y detallado.fuente
No hace diferencia si declaras variables dentro o fuera del ciclo for. A continuación se muestra el código de muestra para probar.
Los resultados mostraron en mi caso
Gracias - MyFavs.in
fuente
let
lugar devar
ya()
tiende a ser un poco más lento (como 120 vs 115 ms = ~ 6% = IMO insignificante)La pregunta aquí es básicamente declarar una var dentro de un bucle. Solo piensa en lo que sucede si haces esto:
¿Crees que esto es correcto? No ... porque no quieres declarar una variable tantas veces. Cuando declaras una variable dentro de un ciclo, ¿no está declarando tantas veces que el ciclo se ejecuta? Obviamente te abofeteará cuando estés en modo 'uso estricto'. La gente no estuvo de acuerdo con Crockford sin pensar en la pregunta original.
Por lo tanto, siempre es bueno declarar variables en la parte superior: 1. Para facilitar la lectura, 2. Hacer buenos hábitos.
fuente
Con respecto al rendimiento después de ejecutar la prueba en Chrome, Firefox y jsperf en un sistema operativo Linux, parece haber una diferencia de rendimiento entre la declaración de variables en un bucle y fuera de un bucle. Es una pequeña diferencia, pero esto también se ve agravado por la cantidad de iteraciones y la cantidad de declaraciones variables.
Por lo tanto, para un mejor rendimiento, tendría que sugerir declarar variables fuera del ciclo. O mejor aún, declara tus variables en línea. Ver ejemplo.
Observe cómo la variable 'al' y 'av' están en la línea de declaración de bucle for. Esta declaración en línea me ha proporcionado un rendimiento consistentemente mejor. Incluso sobre la declaración de variables fuera del ciclo. Nuevamente, la diferencia de rendimiento es realmente pequeña.
https://jsperf.com/outside-inline-for-loop-ase/1
fuente