2012-04-16 15 views
5

He estado trabajando en un proyecto web durante los últimos 4 meses. Para optimizar el rendimiento del código, hemos utilizado un patrón. Mi duda es, ¿realmente aumenta el rendimiento o no?javascript este objeto

cuando alguna vez tenemos que usar el objeto this lo asignamos a una variable local, y usamos eso.

function someFunction() 
{ 
    var thisObject = this; 
    //use thisObject in all following the code. 
} 

la suposición aquí es que, asignando this objeto a una variable de pila local impulsará el rendimiento.

No he visto este tipo de codificación en ninguna parte, así que dudo si no sirve de nada.

EDIT: Sé que la asignación de este objeto a la variable local se hace para preservar el objeto, pero ese no es nuestro caso.

+1

Es extremadamente común en las cosas de Node.js. Pero eso es más para mantener una referencia en las devoluciones de llamada, en lugar de un aumento de rendimiento, creo. – Chad

+1

Voy a adivinar que esto es realmente * peor * por el rendimiento. El compilador de cierres de Google (con optimizaciones avanzadas) eliminará la declaración de var y reemplazará las instancias de 'thisObject' con' this', aunque el uso de una variable a menudo resultaría en un tamaño reducido más pequeño. El compilador de cierre optimiza la velocidad y el tamaño, pero parece favorecer la velocidad sobre el tamaño cuando puede elegir. –

Respuesta

7

Si bien esta es una práctica común en Javascript, es no hecho por motivos de rendimiento. El guardado del objeto this en otro local nombrado generalmente se realiza para conservar el valor de this a través de devoluciones de llamada que se definen dentro de la función.

function someFunction() { 
    var thisObject = this; 
    var someCallback = function() { 
    console.log(thisObject === this); // Could print true or false 
    }; 
    return someCallback; 
} 

Sea o no thisObject === this un resultado verdadero dependerá de cómo se llama

var o = {} 
o.someFunction = someFunction(); 
var callback = o.someFunction(); 
callback();  // prints false 
callback.call(o); // prints true 
+0

hemos utilizado este patrón en funciones simples que no tienen ninguna devolución de llamada más o menos. lo que quiero saber es si tiene algún aumento de rendimiento? –

+0

@TejeshAlimilli es muy poco probable que esto tenga una diferencia de rendimiento notable – JaredPar

+0

Gracias. eso es lo que quería saber –

0

Aun cuando este tipo de optimización tiene un efecto (positivo), es muy probable que dependa de la intérprete.

Otra versión puede revertir los resultados.

Sin embargo, al final debe medir, no adivinar.

2

Al igual que con TODAS las preguntas de rendimiento, deben examinarse midiendo realmente el rendimiento. En una rather simple test case (su código real puede variar algunos), Encuentro resultados mixtos a través de los navegadores:

enter image description here

Chrome y Firefox no difieren mucho entre las dos pruebas, pero la pequeña diferencia está en frente direcciones entre los dos. IE9 muestra la prueba usando una copia guardada de this que llamé self para ser significativamente más lenta.

Sin una diferencia de rendimiento significativo y compatible con Chrome y Firefox y IE9 muestra el caso this prueba para que sea sustancialmente más rápido, creo que se puede concluir que el patrón de diseño que preguntaste no está entregando un aumento de rendimiento consistente a través de los navegadores.

En mi código, guardar una copia de this a otra variable sólo cuando lo necesito para una referencia constante al objeto original en el interior de los manipuladores de eventos en línea, las devoluciones de llamada o los métodos en this se ha establecido en otra cosa. En otras palabras, solo aplico este patrón de diseño cuando sea necesario.

En un previous discussion of this design pattern here on SO, se concluyó que algunas bibliotecas utilizan este patrón de diseño con el fin de permitir la minimización adicional, ya this no puede ser miniaturizada por debajo de los cuatro caracteres que ocupa, pero asignarlo a una variable local se puede minified a una nombre de variable de un solo carácter.

+0

Opera parece micro optimizar el caso de prueba, se ejecutan en exactamente el mismo tiempo :-) – Bergi