2011-09-25 12 views
7

He leído the article about Google's upcoming DASH/DART language, que encontré bastante interesante.¿Cómo puede Dart de Google obtener un mejor rendimiento?

Una cosa que encontré es que dicen que eliminarán los problemas de rendimiento inherentes de JavaScript. Pero, ¿cuáles son exactamente estos problemas de rendimiento? No hay ningún ejemplo en el texto. Esto es todo lo que dice:

  • Rendimiento - Dash está diseñado con características de rendimiento en mente, de modo que es posible crear máquinas virtuales que no tienen el rendimiento problemas que todas las máquinas virtuales EcmaScript debe tener.

¿Tiene alguna idea sobre cuáles son esos problemas de rendimiento inherentes?

+1

Puntos de referencia o no sucedió. Especular sobre el rendimiento de algo inédito es una mierda. – fijal

+0

Lo curioso es que Dart parecía ser ** más lento ** que JS. – c69

Respuesta

5

Un ejemplo es tail call eliminación (estoy seguro de que algunos lo consideran necesario para alto rendimiento functional programming). Un feature request se puso en Javascript V8 de VM de Google, pero esta fue la respuesta:

eliminación de la cola de llamadas no es compatible con JavaScript, ya que se utiliza en el verdadero mundo.

+0

Perfecto, ¡justo lo que estaba buscando! – Sune1987

8

Este hilo es una lectura obligada para cualquier persona interesada en el lenguaje dinámico sólo en los compiladores de tiempo: http://lambda-the-ultimate.org/node/3851

Los participantes de este hilo es el creador de luajit, la gente PyPy, los desarrolladores de JavaScript de Mozilla y muchos más . Preste especial atención a los comentarios de Mike Pall (él es el creador de luajit) y sus opiniones sobre javascript y python en particular. Él dice que el diseño del lenguaje afecta el rendimiento. Le da importancia a la simplicidad y la ortogonalidad, al tiempo que evita los casos de esquina locas que plagan javascript, por ejemplo.

Se discuten muchas técnicas y enfoques diferentes (rastreo de errores, errores de método, intérpretes, etc.). ¡Compruébalo!

Luis

6

El artículo se refería a las dificultades de optimización que provienen de lenguas muy dinámicos como JavaScript, además de herencia de prototipos.

En idiomas como Ruby o JavaScript, la estructura del programa puede cambiar en tiempo de ejecución. Las clases pueden obtener un nuevo método, las funciones pueden ser evaluadas (existentes) y más. Esto hace que sea más difícil para los tiempos de ejecución para optimizar su código, porque la estructura nunca se garantiza que se establezca.

La herencia de Prototypal es más difícil de optimizar que los lenguajes basados ​​en clases más tradicionales. Sospecho que esto se debe a que hay muchos años de experiencia en investigación e implementación para máquinas virtuales basadas en clases.

Curiosamente, V8 (motor de JavaScript de Chrome) utiliza clases ocultas como parte de su estrategia de optimización. Por supuesto, JS no tiene clases, por lo que el diseño del objeto es más complicado en V8.

El diseño de objetos en V8 requiere un mínimo de 3 palabras en el encabezado. Por el contrario, Dart VM requiere solo 1 palabra en el encabezado. El tamaño y la estructura de un objeto Dart se conocen en tiempo de compilación.Esto es muy útil para los diseñadores de VM.

Otro ejemplo: en Dart, hay listas reales (también conocidas como matrices). Puede tener una lista de longitud fija, que es más fácil de optimizar que las matrices que no son realmente de JavaScript y siempre con longitudes variables.

Leer más sobre la compilación de dardo (y JavaScript) a un código eficiente con esta presentación: http://www.dartlang.org/slides/2013/04/compiling-dart-to-efficient-machine-code.pdf

dimensión Otra actuación es el tiempo de arranque. A medida que las aplicaciones web se vuelven más complejas, aumenta la cantidad de líneas de código. El diseño de JavaScript hace que sea más difícil optimizar el inicio, ya que al analizar y cargar el código también se ejecuta el código. En Dart, el lenguaje ha sido cuidadosamente diseñado para que sea rápido de analizar. Dart no ejecuta código mientras carga y analiza los archivos.

Esto también significa que las máquinas virtuales Dart pueden almacenar en caché una representación binaria de los archivos analizados (conocida como instantánea) para un inicio aún más rápido.