2011-05-24 28 views

Respuesta

9

En los navegadores donde esto podría realmente importa (léase: IE) que se calcula cada vez, por lo que es más rápido para almacenar el valor en una variable local.

http://jsperf.com/string-length


Se used to be que

var len = someArray.length; 
for (var i=0; i<len; i++) { 
    // ... 
} 

era más rápido que

for (var i=0; i<someArray.length; i++) { 
    // ... 
} 

pero en estos días, (motor JS de Chrome) de V8 optimiza el último a correr más rápido que el ex. Eso es genial, solo recuerda, realmente no necesitas preocuparte por el rendimiento en Chrome.


Si tienes curiosidad para aprender más sobre el rendimiento de JavaScript, High Performance JavaScript es una lectura sólida. Sin embargo, tenga en cuenta sus recomendaciones, ya que un truco que hace que el código funcione más rápido en IE (6, 7, 8 o incluso 9) podría hacer que el código sea más lento en Chrome o Firefox 4.

+0

Resulta interesante cómo todavía es un poco más lento aún en IE9. Sin embargo, Chrome era ojo por ojo. – Matt

1

el segundo es, de lejos, la forma más segura de ir. En el primero, asume que no se volverá a calcular. En el segundo, sabes que no. El segundo no es siempre la mejor manera. Solo funcionará cuando sepa otros procesos no afectarán la longitud de la matriz. Entonces, con variables globales, etc., debes tener cuidado. Esto también se puede aplicar a la modificación del contenido (longitud) de una matriz dentro de un ciclo for que se detiene en el límite superior de la matriz.

0

En teoría, esperaría que el segundo bloque de código sea más rápido.

Sin embargo, dado que los intérpretes JS de hoy en día son en realidad compiladores JIT altamente optimizados, me imagino que detectarían ese tipo de cosas y lo optimizarían.

Esto debería aplicarse a casi todos los navegadores en el uso corriente actual, con la obvia excepción de IE8 y menor, donde nadie sabe cómo lo hace, pero será lento de cualquier manera.

1

Strings are immutable in JavaScript, por lo que es poco probable que incluso las malas implementaciones de Javascript recalcuarán la propiedad de longitud de la cadena cada vez que acceda a ella.

Puede probarlo usted mismo usando jsperf; usando Chrome 12, it actually looks like your first example is faster.

+1

No se trata de calcular la longitud, ya que las cadenas son inmutables, su longitud es una propiedad (constante). Es una cuestión de acceder a esa propiedad repetidamente. –

+0

@Matt - de hecho, estaba pensando en términos de propiedades C# que pueden ocultar cálculos complejos.Mi punto era básicamente que, dado que las cadenas son inmutables, la longitud es un valor constante, por lo que es poco probable que haya diferencias de rendimiento significativas entre los ejemplos de OP. (Y como ha encontrado, los fragmentos realmente funcionan de manera diferente en diferentes implementaciones de JS) – Dexter

Cuestiones relacionadas