Pregunta

Viniendo de un entorno de C / C++, el diseño de la memoria de los objetos con respecto a la reducción de errores de caché es algo crucial, especialmente cuando se trabaja en consolas.El diseño orientado a datos a menudo se prefiere al diseño orientado a objetos, para ayudar a mantener los objetos relacionados cerca unos de otros en la memoria(especialmente en áreas críticas de rendimiento).

Recientemente, he estado desarrollando Javascript y me pregunto cuál es el consenso general dentro de la comunidad de Javascript.

Con mi limitada experiencia en Javascript, a menudo me sorprende ver resultados completamente inesperados al crear perfiles.El diseño de la memoria interna y la implementación de objetos/estructuras Javascript varían tanto de un navegador a otro, que me pregunto si vale la pena el esfuerzo de intentar optimizarlo.

Creé un caso de prueba simple (http://jsperf.com/object-vs-data) en jsPerf para comparar el rendimiento de los dos métodos, y aunque muestra ganancias de rendimiento en Chrome, no hay una aceleración notable en Safari.

En Javascript, ¿debería preocuparme siquiera por el diseño de la memoria de los objetos? ¿O es más una cosa del tipo 'implementarlo de una manera y luego optimizarlo si es necesario'?

Esta segunda opción parece un desperdicio (en términos de tiempo de desarrollo), especialmente si hay alguna buena guía a seguir.

Gracias~

Información Complementaria:Básicamente, así es como implementaría los dos enfoques en Javascript.El caso de prueba jsPerf anterior se implementa así.

var objectOriented = [
    { foo: 1, bar: 2 },
    { foo: 3, bar: 4 }
];

var dataOriented = {
    foos: [1, 3],
    bars: [2, 4]
};

// Object-oriented access:
var a = objectOriented[0].bar;

// Data-oriented access:
var b = dataOriented.bars[0];
¿Fue útil?

Solución

Estás trabajando desde la suposición fundamental de que los objetos en Javascript funcionan como lo hacen en C++.Ellos no.

En C++, el propósito principal de un tipo es actuar como una "lente" sobre un trozo de memoria.El diseño de la clase define directamente el contenido de la memoria que describe el objeto, de una manera bien definida.Las matrices C / C++ requieren específicamente un diseño lineal y continuo de tipos homogéneos.

En JavaScript, un objeto es una colección de pares nombre / valor.Una matriz es solo un objeto con una propiedad especial de" longitud".Tenga en cuenta que aquí no hay una descripción o definición del diseño de la memoria.No hay nada que impida que un intérprete de Javascript implemente matrices como una tabla hash en lugar de una porción lineal de memoria;de hecho, estoy seguro de que son implementaciones JS que hacen precisamente eso.

Las implementaciones de JavaScript son libres de diseñar la memoria como quieran, y no hay correspondencia entre lo que haces en el código fuente y lo que realmente termina en la máquina.

Además, las matrices de JavaScript son heterogéneas, no homogéneas.Es decir, suponiendo que se haya distribuido en memoria contigua, su tipo equivalente en C sería JSObject **, no int ** (o float ** o lo que sea).Una matriz JS es una colección de referencias a datos almacenados en otro lugar, por lo que incluso si las referencias estuvieran en su línea de caché, sus datos no lo estarán.

Entonces , en resumen, este tipo de pensamiento no te hará ganar nada más que dolor.JavaScript es un lenguaje de nivel mucho más alto que C++, y parte de eso es renunciar al control al que estás acostumbrado.Ese tipo de optimización de bajo nivel, si es posible, la realizará el intérprete.Concéntrese en escribir código con algoritmos eficientes que expresen naturalmente su solución;ya es bastante difícil como es.:-)

Otros consejos

Ok.Jugueteó con algunos números y casos de prueba..

En primer lugar, creé este caso de prueba http://jsperf.com/object-vs-array-creation-for-so En este caso, creando Object es mucho más rápido luego creando un Array

En segundo lugar, creé este caso de prueba http://jsperf.com/accessing-speed En esto, apenas había diferencia entre ellos..

Entonces, lo que infiero de este perfil es que usar objetos más que matrices será más rápido si el proyecto es realmente enorme..ya que, desde el primer caso, está claro que la creación de objetos es más rápida que la creación de matrices.

Pero..

Javascript es un lenguaje altamente desarrollado y de alto rendimiento y no debería preocuparse por tales microoptimizaciones.Todo lo que debes concentrarte es en el semántica.Debes elegir la estructura que mejor describa tu intención..

Pruebas en Chrome 36.0.1985.125 en Windows NT 6.3

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top