2009-04-14 11 views
6

¿Pueden ayudarme a determinar la diferencia de rendimiento de cada una de estas declaraciones ? ¿Cuál usarías?Declaración de JavaScript Preguntas sobre el rendimiento

  1. Fabricación de una nueva matriz mediante

    - var new_list = new Array(); or 
    - var new_list = [] 
    
  2. elemento Anexar utilizando

    • de empuje ('a')
    • new_list [i]; (Si conozco la longitud)
  3. operador ternario o si() {} else() {}

  4. Tratando de hacer ISODD función, que es más rápido
    (! (Is_even)) o (x% 2! = 0)

  5. foreach o normales de iteración

uno más

  1. a = b = 3; o b = 3; a = b;

[edit: Im making a Math Library. Por lo tanto, cualquier discusión de piratería de rendimiento también es bienvenida :)]

Gracias por su ayuda.

+0

Prefiero usar 'var myArray = [];' porque es más simple ... –

Respuesta

4

Las características de rendimiento para todos los navegadores (especialmente a nivel de funciones de biblioteca individuales) pueden variar drásticamente, por lo que es difícil dar respuestas significativas y significativas a estas preguntas.

Anyhoo, simplemente mirando a los motores rápidos js (por lo Nitro, TraceMonkey, y V8)

  1. [ ] será más rápido que new Array-new Array se convierte en la siguiente lógica

    1. cons = propiedad de búsqueda "Matriz", si no se puede encontrar, lanzar una excepción
    2. Comprobar para ver si cons se puede utilizar como un constructor, si no: una excepción
    3. thisVal = tiempo de ejecución crea un nuevo objeto directamente
    4. res = resultado de llamar cons pasar thisVal como valor para this - que requiere la lógica de distinguir las funciones de JS desde funciones de tiempo de ejecución estándar (suponiendo que las funciones de tiempo de ejecución estándar no se implementan en JS, que es el caso normal). En este caso, Array es un constructor nativo que creará y devolverá un nuevo objeto de matriz en tiempo de ejecución.
    5. si res es indefinido o nulo, entonces el resultado final es thisVal; de lo contrario, el resultado final es res. En el caso de llamar Array se devolverá un nuevo objeto de matriz y thisVal se desechará

    [ ] simplemente le dice al motor de JS para crear directamente un nuevo objeto de matriz de tiempo de ejecución inmediatamente sin lógica adicional. Esto significa que new Array tiene una gran cantidad de lógica adicional (no es muy barata) y realiza una asignación de objetos adicional innecesaria.

  2. newlist[newlist.length] = ... es más rápido (esp. Si newList no es una matriz dispersa), pero empuje es lo suficientemente común como para que yo esperaba que los desarrolladores de motores para poner un poco de esfuerzo en la mejora del rendimiento por lo que este podía cambio en el tiempo.

  3. Si usted tiene un bucle lo suficientemente apretado que puede haber una ligera victoria para el operador ternario, pero podría decirse que es un defecto del motor en el caso trivial de a = b ? c : d vs if (b) a = c; else a = d

  4. Sólo la llamada sobrecarga de la función por sí solo empequeñecer el costo de más o menos cualquier operador JS, al menos en los casos sanos (por ejemplo. que se está realizando la aritmética con números en lugar de objetos)

  5. la sintaxis foreach todavía no ha sido estandarizada pero su performane final dependerá en una gran cantidad de detalles; A menudo, la semántica de JS hace que las declaraciones de aspecto eficiente sean menos eficientes, por ejemplo. for (var i in array) ... es mucho más lento que for (var i = 0; i < array.length; i++) ... ya que la semántica JS requiere in enumeración para crear una lista de todas las propiedades del objeto (incluida la cadena de prototipos) y luego comprobando para asegurarse de que cada propiedad todavía está en el objeto antes de enviarlo a través del bucle Ah, y las propiedades deben convertirse de enteros (en el caso de la matriz de todos modos) en cadenas, lo que cuesta tiempo y memoria.

4

me gustaría sugerir que codifique una secuencia de comandos simple como:

for(var i = 0; i < 1000; i++){ 
    // Test your code here. 
} 

Puede referencia lo que quiera de esa manera, posiblemente añadiendo funciones de temporización antes y después de la declaración for para ser más exactos.

Por supuesto, deberá ajustar el límite superior (1000 en este ejemplo) según la naturaleza de sus operaciones: algunas requerirán más iteraciones y otras menos.

+0

He hecho esto antes, y tengo algunos consejos. Primero, prueba en múltiples navegadores, ya que tienen diferentes motores JS. Segundo, necesitarás más de 1000 iteraciones para ver los resultados. Y tercero, tendrá que desactivar las advertencias de script en navegadores como IE. –

+0

Además, cada navegador rastrea el tiempo de manera diferente (incorrectamente). Como, escuché que hay casos en que IE ignorará tiempos menores a 15 ms. –

3
  1. Ambos son constructores nativos, probablemente no hay diferencia.
  2. empuje es más rápido, se asigna directamente a los nativos, en tanto que [] son ​​evaluativo
  3. Probablemente no es una gran diferencia, pero técnicamente, no hacen lo mismo, así que no es manzanas con manzanas
  4. x% 2, omite la llamada a la función que es relativamente lenta
  5. He oído, aunque no puedo encontrar el enlace en este momento, que la iteración es más rápida que la foreach, lo cual fue sorprendente para mí.

Editar: En # 5, creo que la razón está relacionada con this, en que foreach se ordena hacia adelante, lo que requiere el incrementador para contar hacia adelante, mientras que para los bucles están siempre tan infinitesimalmente más rápido cuando se ejecutan hacia atrás:

for(var i=a.length;i>-1;i--) { 
    // do whatever 
} 

lo anterior es ligeramente más rápido que:

for(var i=0;i<a.length;i++) { 
    // do whatever 
} 
+0

Debes ser como este javascript ninja. El número 5 es el más impactante. ¿Hay algún otro truco de rendimiento que sugiera? – unj2

+0

En realidad, es bastante sencillo en cuanto a por qué, necesita evaluar una longitud para cada iteración, mientras que con la primera solo la toma la prueba inicial y la prueba contra cero. – cgp

+1

A para # 5, hay otra alternativa basada en su primer ejemplo: var l = data.length; para (var i = 0; i

1

Como otros sugieren, creo que haciendo un poco áspera evaluación comparativa es la mejor opción ... Sin embargo, yo también Nótese que tendrá pag Obtuve robably resultados muy diferentes de diferentes navegadores, ya que estoy seguro de que la mayoría de las preguntas que está haciendo se reducen a la implementación interna específica de las construcciones de lenguaje en lugar del lenguaje en sí.

5

Siempre he supuesto que, dado que (x & 1) es una operación bit a bit, sería la manera más rápida de verificar números pares/impares, en lugar de verificar el resto del número.

1

Usted puede estar interesado en this question y las respuestas a que

+0

Jaja, pensé "ooh que podría ser interesante" y luego descubrí que era la respuesta principal: - / – olliej