¿Cómo afectan los distintos proyectos de optimización de Javascript al rendimiento de DOM?

Hay una gran cantidad de capital C, capital S en informática que ingresa a Javascript a través de los proyectos Tracemonkey, Squirrelfish y V8. ¿Alguno de estos proyectos (u otros) abordan el rendimiento de las operaciones DOM, o están relacionados puramente con el cálculo de Javascript?
Mejor respuesta
El rendimiento de las operaciones DOM puras (getElementById / Tagname / Selector, nextChild, etc.) no se ve afectado ya que ya están en C pura.

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

Un ejemplo de lo anterior es la dependencia de TraceMonkey de que todas las llamadas sean a funciones JS. Debido a que una traza en realidad alinea la ruta de ejecución en cualquier punto donde JS golpea el código que no puede ser en línea (código nativo, recursión polimórfica verdadera, manejadores de excepciones), la traza se cancela y la ejecución recae en el 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 manejo de la recursión polimórfica); sin embargo, no es factible rastrear de manera realista las llamadas a funciones nativas arbitrarias (por ejemplo, el DOM). Por esa razón, creo que están considerando implementar más DOM en JS (o al menos de una manera amigable para JS). Dicho esto, cuando el código es rastreable, TM puede hacer un trabajo excepcionalmente bueno, ya que puede reducir la mayoría de los “objetos” a equivalentes más eficientes y / o nativos (p. Ej., Utilizar entradas de máquina 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 en el sentido de que ambos JIT codifican todo JS inmediatamente y producen código que es más especulativo (por ejemplo, si estás haciendo a * b, generan código que asume ayb son números y recurren al código excepcionalmente lento si no lo son). Esto tiene una serie de beneficios sobre el seguimiento, es decir, que puede jit todo el código, independientemente de si llama o no a las excepciones de código nativo o de lanzamiento, etc., lo que significa que una sola llamada DOM no destruirá el rendimiento. El inconveniente es que todo el código es especulativo: TM realizará llamadas en línea a Math.floor, etc., pero lo mejor que puede hacer JSC / V8 sería equivalente a a = Math.floor (0.5) – > a = (Math.floor == realFloor)? inline: Math.floor (0.5) esto tiene costos tanto en rendimiento como en uso de memoria, y tampoco es particularmente factible. La razón de esto es la compilación inicial, mientras que TM solo código JIT después de ejecutarse (y por lo tanto sabe exactamente qué función se llamó) JSC y V8 no tienen una base real para hacer tal suposición y básicamente tienen que adivinar (y actualmente ninguno de los intentos). esta). Lo único que hacen V8 y JSC 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 caché, en casos especialmente candentes reescriben pequeñas porciones de la secuencia de instrucciones y, en otros casos, mantienen los cachés fuera de banda. A grandes rasgos si tienes código que va

a.x * a.y

V8 y JSC verifican el ‘tipo implícito’ / ‘Estructura’ dos veces – una vez para cada acceso, y luego verifican que ax y ay son números, mientras que TM generará un código que verifica el tipo de a una sola vez, y puede ( siendo todas las cosas iguales) simplemente multiplica ax y ay sin verificar que sean números.

Si está considerando la velocidad de ejecución pura, actualmente hay algo parecido a una bolsa mixta, ya que cada motor parece funcionar mejor en ciertas tareas que en otras: TraceMonkey gana en muchas pruebas de matemáticas puras, V8 gana en casos muy dinámicos, JSC gana si hay una mezcla. Por supuesto, si bien es cierto hoy, puede que no sea mañana, ya que todos estamos trabajando arduamente para mejorar el rendimiento.

El otro problema que mencioné fue el costo de enlace de DOM < - > JS; esto puede jugar un papel muy importante en el rendimiento web, el mejor ejemplo de esto es Safari 3.1 / 2 vs Chrome en el punto de referencia de Dromaeo. Chrome se basa en la rama Safari 3.1 / 2 de WebKit, por lo que es razonablemente seguro asumir un rendimiento similar del DOM (la diferencia del compilador podría causar cierto grado de variación). En este punto de referencia, 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, ver los enlaces de DOM de TM parece injusto, ya que no han completado todo el trabajo que desean hacer (por desgracia), por lo que solo recurren al intérprete:

..

Errmmm, se prolongó un poco más de lo previsto, por lo que la respuesta corta a la pregunta original es “depende”: D

Por favor indique la dirección original:¿Cómo afectan los distintos proyectos de optimización de Javascript al rendimiento de DOM? - Código de registro