¿Por qué una búsqueda doble es más rápida que una búsqueda simple en javascript?
jsperf (1)
Estoy viendo algún comportamiento extraño en una prueba jsperf . Aquí está la configuración:
var pro={};
pro._x=3;
var q=Object.create(pro);
q.x=3;
q.z={};
q.z.x=3;
Luego simplemente busco cada una de las propiedades q._x
, qzx
y qzx
.
La búsqueda única qx
es más rápida que la búsqueda de prototipo q._x
como se esperaba. Pero el qzx
búsqueda doble es el más rápido. Esperaba que qzx
fuera el más lento, especialmente en comparación con qx
.
qzx
es incluso más rápido que qz
. ¿Que esta pasando aqui?
Lo que hace que la búsqueda más profunda sea más rápida es el hecho de que el motor de JavaScript puede optimizar mejor el código para el rendimiento, ya que sabe exactamente qué objeto está recibiendo.
A diferencia de usar Object.create
, donde el motor no puede realizar su ciclo de optimización regular, el uso de un objeto vacío antiguo simple para inicializar la propiedad z
del objeto q
, básicamente permite que el motor asigne la memoria apropiada y la indexe en consecuencia.
Esta pieza de código var q=Object.create(pro);
básicamente le dice al motor JS: "Oye, estás obteniendo una instancia de un Object
pero no tengo ni idea de qué tipo es. Podría ser un Array, Objec, RegExp, Date.", mientras que este fragmento de código - - qz={};
dice: "¡Oye, obtienes un Object
Objeto aquí! Asegúrate de guardar algo de memoria de acuerdo con este tipo de datos".