¿Cómo afectan los diversos proyectos de optimization de Javascript el performance de DOM?

Hay una gran cantidad de capital C, la informática de capital S ingresando a Javascript a través de los proyectos Tracemonkey, Squirrelfish y V8. ¿Alguno de estos proyectos (u otros) abordan el performance de las operaciones DOM, o están relacionados puramente con el cálculo de Javascript?

El performance de las operaciones de DOM puro (getElementById / Tagname / Selector, nextChild, etc.) no se ven afectados ya que ya están en C ++ puro.

La forma en que las mejoras del motor JS afectarán el performance depende en cierta medida de las técnicas particulares utilizadas para las mejoras de performance, así como del performance del puente DOM-> JS.

Un ejemplo de lo primero es la dependencia de TraceMonkey de que todas las llamadas sean para funciones JS. Debido a que una traza enmarca efectivamente la ruta de ejecución en cualquier punto donde el JS acceda al código que no puede ser inlineado (código nativo, recursión polimórfica verdadera, manejadores de excepciones) el rastreo se cancela y la ejecución vuelve al intérprete. Los desarrolladores de TM están haciendo un gran trabajo para mejorar la cantidad de código que se puede rastrear (incluido el event handling la recursión polimórfica), sin embargo, el rastreo realist entre llamadas a funciones nativas arbitrarias (por ejemplo, el DOM) no es factible. Por esa razón, creo que están buscando implementar más DOM en JS (o al less de manera amigable con JS). Dicho esto, cuando el código es trazable, TM puede hacer un trabajo excepcionalmente bueno, ya que puede networkingucir la mayoría de los "objects" a equivalentes más eficientes y / o nativos (por ej., Usar máquinas en lugar de la implementación del número JS).

JavaScriptCore (que es donde vive SquirrelFish Extreme) y V8 tienen un enfoque más similar, ya que ambos JIT todos los códigos JS inmediatamente y producen código que es más especulativo (por ejemplo, si estás haciendo a*b , generan código que asume a y b son numbers y vuelven a un código excepcionalmente lento si no lo son). Esto tiene una serie de ventajas con respecto al rastreo, es decir, que puede jitear todo el código, independientemente de si llama al código nativo / arroja excepciones, etc., lo que significa que una sola llamada DOM no destruirá el performance. La desventaja es que todo el código es especulativo: TM realizará llamadas en línea a Math.floor, etc., pero lo mejor que JSC / V8 puede hacer sería equivalente a a=Math.floor(0.5) -> a=(Math.floor == realFloor) ? inline : Math.floor(0.5) a=(Math.floor == realFloor) ? inline : Math.floor(0.5) esto tiene costos tanto en performance como en uso de memory, tampoco es particularmente factible. La razón para esto es la compilation inicial, mientras que TM solo usa el código JIT después de su ejecución (y sabe exactamente cómo se llamó la function). JSC y V8 no tienen una base real para hacer tal suposition y básicamente tienen que adivinar (y actualmente ninguno intenta esta). Lo único que V8 y JSC hacen para tratar de compensar este problema es rastrear lo que han visto en el pasado e incorporarlo a la ruta de ejecución, ambos usan una combinación de técnicas para hacer este almacenamiento en caching, en casos especialmente calientes. reescriben pequeñas porciones de la secuencia de instrucciones, y en otros casos mantienen las memorys caching fuera de banda. En términos generales, si tiene un código que va

 ax * ay 

V8 y JSC verificarán el 'tipo implícito' / 'Estructura' dos veces, una para cada acceso, y luego verificarán que ax y ay son ambos numbers, mientras que TM generará código que verifica el tipo de a sola vez, y puede ( en igualdad de condiciones) simplemente multiplique ax y ay sin verificar que sean numbers.

Si está buscando una velocidad de ejecución pura, actualmente hay algo de mezcla, ya que cada motor parece funcionar mejor en ciertas tareas que en otras: TraceMonkey gana en muchas testings de matemáticas puras, V8 gana en casos muy dynamics, JSC gana si hay una mezcla. Por supuesto, si bien es cierto hoy puede que no sea mañana ya que todos estamos trabajando duro para mejorar el performance.

El otro problema que mencioné fue el costo de vinculación de DOM <-> JS, esto en realidad puede jugar un papel muy importante en el performance web, el mejor ejemplo de esto es Safari 3.1 / 2 frente a Chrome en el benchmark Dromaeo. Chrome se basa en la twig Safari 3.1 / 2 de WebKit, por lo que es razonablemente seguro asumir un performance DOM similar (la diferencia del comstackdor podría causar cierto grado de variación). En este benchmark, Safari 3.1 / 2 en realidad supera a Chrome a pesar de tener un motor JS que es claramente mucho más lento, esto se debe básicamente a enlaces más eficientes entre JSC / WebCore (el dom / rendering / etc de WebKit) y V8 / WebCore

Actualmente, mirar los enlaces DOM de TM parece injusto ya que no han completado todo el trabajo que quieren hacer (¡ay!), Así que simplemente recurren al intérprete 🙁

..

Errmmm, eso continuó un poco más de lo previsto, por lo que la respuesta breve a la pregunta original es "depende": D

Ellos son JavaScript puro. A less que se implemente una llamada de método DOM particular en JS, tendrán poco efecto (por no decir que no se haya hecho trabajo para networkingucir la sobrecarga de tales llamadas).

La optimization de DOM es una herradura completa de ardillas, monos, arañas, peces … El layout e incluso los motores de renderización entran en juego, y cada browser tiene su propia estrategia de implementación y optimization.