2011-07-05 11 views
16

Los objetos en JavaScript se pueden usar como Hashtable (la clave debe ser Cadena) ¿Funciona bien como Hashtable la estructura de datos?¿Cómo implementa JavaScript VM el acceso a la propiedad Objeto? ¿Es Hashtable?

Es decir, ¿se implementa como Hashtable detrás de la escena?

Actualización: (1) Cambié HashMap a hashtable (2) Supongo que la mayoría del navegador lo implementa de la misma manera, si no ¿por qué no? ¿Hay algún requisito sobre cómo implementarlo en las especificaciones de ECMAScript?

Actualización 2: Entiendo, me pregunto cómo el V8 y el Firefox JS VM implementa Object.properties getters/setters?

+2

Bueno, lo que es un “HashMap” en su opinión? – Gumbo

+0

Creo que se está refiriendo a un 'java.util.HashMap' que no es lo mismo en absoluto. –

+1

Javascript no es java, y no está implementado en java. – Victor

Respuesta

23

V8 no implementa propiedades de acceso a objetos como tabla hash, que en realidad implementar de una manera mejor (se refiere a 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 detrás de las escenas", que hacen que el acceso a las propiedades sea casi tan rápido como el acceso a las propiedades de los objetos de C++.

¿Por qué? porque en la clase fija cada propiedad se encuentra en una posición de apoyo fijo específico ..

Así que en general, el acceso a la propiedad de un objeto en V8 es más rápido que Hashtable ..

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

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

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

+1

El enlace del documento de diseño V8 está roto. ¿Alguna idea a dónde ha ido esto? – Jules

+4

El nuevo enlace del documento es https://developers.google.com/v8/design#prop_access –

+0

¿Cómo podría crear una clase estática para un objeto que puede tomar claves arbitrarias generadas en el tiempo de ejecución? Seguramente no puede hacer esto en todos los casos. – devios1

8

"Supongo que la mayoría del navegador lo implementa de la misma manera, si no ¿por qué no? ¿Existe algún requisito sobre cómo implementarlo en las especificaciones de ECMAScript?"

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

edición - a pesar de los dos downvotes, de hecho, esto es absolutamente correcto, y de hecho es la puesta en práctica de la independencia de la especificación ECMA-262 se desscribed específicamente en section 8.6.2 de la especificación:

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

"Los objetos 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, por ejemplo, Internet Explorer 6.0 y V8 de Google Chrome no tienen casi nada en común, pero (más o menos) tanto cumplir con las mismas especificaciones.

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

Las tablas hash son una forma eficiente de crear referencias cruzadas. Ellos no son la única manera. Algunos motores pueden optimizar el almacenamiento para juegos pequeños (por ejemplo, la sobrecarga de una tabla hash puede ser menos eficiente).

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 memoria. Por ejemplo, vea la discusión interesante en this post from John Reseig's blog sobre el uso de una estructura de datos trie.

Pero eso no es ni aquí ni allá.Su elección de si usar esto o los objetos JS nativos no debería estar impulsado por la información sobre cómo JS implementa los objetos. Debe ser impulsado solo por la comparación de rendimiento: cómo escalar cada método. Esta es información que obtendrás al hacer pruebas de rendimiento, no solo por saber algo sobre la implementación del motor JS.

+0

Gracias por los votos abajo: si hay algo impreciso sobre mi respuesta, sería mucho más útil para cualquiera que lea esta pregunta explicar y/o proporcionar referencias. –

+3

Supongo que es porque la pregunta es sobre las implementaciones reales ("detrás de escena"). Decir que la especificación no * requiere * una solución específica es de ayuda limitada aquí. – kassens

+2

Sí, las consideraciones de rendimiento deben ser impulsadas por datos reales. Pero conocer la estrategia de implementación es una heurística extremadamente útil que es muy económica de determinar: es una gran pasada de referencia de la servilleta en el benchmarking. Tu publicación tiene mucha información útil, pero la pregunta de OP sigue siendo válida. –

Cuestiones relacionadas