Saltar al contenido

¿Cómo implementa JavaScript VM el acceso a la propiedad del objeto? ¿Es Hashtable?

Solución:

V8 no implementa el acceso a las propiedades del objeto como tabla hash, en realidad lo implementa de una mejor manera (en cuanto al rendimiento)

¿Entonces, cómo funciona? “V8 no utiliza la búsqueda dinámica para acceder a las propiedades. En su lugar, V8 crea dinámicamente clases ocultas entre bastidores”, lo que hace que el acceso a las propiedades sea casi tan rápido como acceder a las propiedades de los objetos C ++.

¿Por qué? porque en la clase fija cada propiedad se puede encontrar en una ubicación de compensación fija específica.

Entonces, en general, acceder a la propiedad de un objeto en V8 es más rápido que Hashtable ..

No estoy seguro de cómo funciona en otras máquinas virtuales.

Puede encontrar más información aquí: https://developers.google.com/v8/design#prop_access

También puede leer más sobre Hashtable en JS aquí: (mi blog) http://simplenotions.wordpress.com/2011/07/05/javascript-hashtable/

“Supongo que la mayoría de los navegadores lo implementan de la misma manera, si no, ¿por qué no? ¿Existe algún requisito de cómo implementarlo en las especificaciones de ECMAScript?”

No soy un experto, pero no puedo pensar en ninguna razón por la que una especificación de lenguaje detallaría exactamente cómo se deben implementar internamente sus características. Tal restricción no tendría absolutamente ningún propósito, ya que no afecta el funcionamiento del lenguaje de ninguna otra manera que no sea el rendimiento.

editar – a pesar de los dos votos negativos, de hecho, esto es absolutamente correcto y, de hecho, la independencia de implementación de la especificación ECMA-262 se describe específicamente en la sección 8.6.2 de la especificación:

“Las descripciones en estas tablas indican su comportamiento para objetos ECMAScript nativos, a menos que se indique lo contrario en este documento para tipos particulares de objetos ECMAScript nativos. Los objetos del host pueden admitir estas propiedades internas con cualquier comportamiento dependiente de la implementación siempre que sea coherente con las restricciones específicas del objeto del host indicadas en este documento.

“Los objetos de host pueden implementar estos métodos internos de cualquier manera a menos que se especifique lo contrario”;

La palabra “hash” no aparece en ninguna parte de la especificación ECMA-262 completa.

(original, continuación)

Las implementaciones de Javascscript en, digamos, Internet Explorer 6.0 y el V8 de Google Chrome no tienen casi nada en común, pero (más o menos) ambos se ajustan a la misma especificación.

Si desea saber cómo hace algo un intérprete de JavaScript específico, debe investigar ese motor específicamente.

Las tablas hash son una forma eficaz de crear referencias cruzadas. No son el único camino. Algunos motores pueden optimizar el almacenamiento para conjuntos pequeños (para los cuales la sobrecarga de una tabla hash puede ser menos eficiente), por ejemplo.

Al final del día, todo lo que necesita saber es que funcionan. Puede haber formas más rápidas de crear tablas de búsqueda de conjuntos grandes, utilizando ajax o incluso en la memoria. Por ejemplo, vea la interesante discusión en esta publicación del blog de John Reseig sobre el uso de una estructura de datos trie.

Pero eso no es ni aquí ni allá. Su elección de usar esto u objetos JS nativos no debe basarse en la información sobre cómo JS implementa los objetos. Debe estar impulsado solo por la comparación de rendimiento: cómo escala cada método. Esta es información que obtendrá al realizar pruebas de rendimiento, no solo al saber algo sobre la implementación del motor JS.

La mayoría de los motores JS modernos utilizan una técnica bastante similar para acelerar el acceso a las propiedades del objeto. La técnica se basa en los llamados clases ocultas, o formas. Es importante comprender cómo funciona esta optimización si desea escribir código JS eficiente.

El objeto JS parece un diccionario, así que ¿por qué no usar uno para almacenar las propiedades? La tabla hash tiene una complejidad de acceso O (1), parece una buena solución. En realidad, los primeros motores JS han implementado objetos de esta manera. Pero en lenguajes de tipo estático, como C ++ o Java, el acceso a una propiedad de instancia de clase es muy rápido. En tales lenguajes, una instancia de clase es solo un segmento de memoria, y cada propiedad tiene su propio desplazamiento constante, por lo que para obtener el valor de la propiedad solo necesitamos tomar el puntero de la instancia y agregarle el desplazamiento. En otras palabras, en tiempo de compilación una expresión como esta point.x simplemente se reemplaza por su dirección en la memoria.

¿Podríamos implementar alguna técnica similar en JS? ¿Pero cómo? Veamos una función JS simple:

function getX(point) {
  return point.x;
}

Como conseguir el point.x ¿valor? El primer problema aquí es que no tenemos una clase (o forma) que describa la point. Pero podemos calcular uno, eso es lo que hacen los motores JS modernos. La mayoría de los objetos JS en tiempo de ejecución tienen una forma que está vinculada al objeto. La forma describe las propiedades del objeto y dónde se almacenan los valores de las propiedades. Es muy similar a cómo una definición de clase describe la clase en C ++ o Java. Es una pregunta bastante importante, cómo se calcula la forma de un objeto, no la describiré aquí. Recomiendo este artículo que contiene una gran explicación de las formas en general, y esta publicación que explica cómo se implementan las cosas en V8. Lo más importante que debe saber sobre las formas es que todos los objetos con las mismas propiedades que se agregan en el mismo orden tendrán la misma forma. Hay pocas excepciones, por ejemplo, si un objeto tiene muchas propiedades que se cambian con frecuencia, o si elimina algunas de las propiedades del objeto usando delete operador, el objeto se cambiará al modo de diccionario y no tendrá forma.

Ahora, imaginemos que el point El objeto tiene una matriz de valores de propiedades, y tenemos una forma adjunta a él, que describe dónde x Se almacena el valor de esta matriz de propiedades. Pero hay otro problema: podemos pasar cualquier objeto a la función, ni siquiera es necesario que el objeto tenga la x propiedad. Este problema se resuelve mediante la técnica denominada almacenamiento en caché en línea. Es bastante simple, cuando getX() se ejecuta la primera vez, recuerda la forma del punto y el resultado de la x buscar. Cuando la función se llama por segunda vez, compara la forma del punto con la anterior. Si la forma coincide, no se requiere una búsqueda, podemos tomar el resultado de la búsqueda anterior.

La conclusión principal es que todos los objetos que describen lo mismo deben tener la misma forma, es decir, deben tener el mismo conjunto de propiedades que se agregan en el mismo orden. También explica por qué es mejor inicializar siempre las propiedades del objeto, incluso si son undefined por defecto, aquí hay una gran explicación del problema.

Recursos relativos:

  • Fundamentos del motor de JavaScript: formas y cachés en línea y un video de YouTube
  • Un recorrido por V8: representación de objetos
  • Propiedades rápidas en V8
  • Clases ocultas de motores de JavaScript (y por qué debería tenerlas en cuenta)
  • ¿Debo poner valores predeterminados de atributos en el prototipo para ahorrar espacio?
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *