2011-01-17 16 views
13

¿Hay algún buen tutorial sobre cómo escribir código rápido y eficiente para v8 (específicamente, para node.js)?Exprimir el rendimiento de v8

¿Qué estructuras debo evitar usar? ¿Cuáles son los modismos que v8 optimiza bien?

+0

Simplemente curioso, pero ¿por qué estás preguntando? ¿No debería estar más preocupado por exprimir el rendimiento de los motores de renderizado más lentos (pero ampliamente utilizados) que el más rápido? Parece que el más rápido se ocupará de sí mismo. – mVChr

+0

Solo quiero saber lo que a v8 no le gusta. El código eficiente me importa. – nornagon

+0

Buena respuesta nornagon: es increíblemente frustrante cuando la pregunta es indiferente y las respuestas no están relacionadas. ¡Yo también estoy interesado simplemente por los intereses! –

Respuesta

18

Desde mi experiencia:

  • No Inlining
  • llamada Función sobrecarga es mínima (inline)
  • Lo que es caro es pasar gran cadenas para funciones, ya que esas necesitan ser copiadas y por mi experiencia V8 no siempre es tan inteligente como podría ser en este caso
  • La búsqueda del alcance es un gasto ive (sorpresa)
  • No haga trucos, p. Tengo un codificador binario para JS Object, arrancando algo de rendimiento extra con bit shift allí (en lugar de Math.floor) el último Crankshaft (sí alfa, pero aún así) ejecuta el código 30% más lento
  • No uses magia. eval, arguments.callee, etc. Esos más o menos matan cualquier optimización ya que el código ya no se puede alinear
  • Algunas de las nuevas cosas de ES5, p. .bind() es realmente lenta en V8 en el momento
  • De alguna manera new Object() y new Array() son un poco más rápido actualmente (MICROoptimization, a menos que usted está escribiendo un poco de palo de codificador loco con {} y [])

Mis reglas:

  • escribir buen código
  • código de trabajo de escritura
  • Escribir código que funciona en modo estricto (soporte todavía tiene to land, pero cuando lo hace la optimización adicional puede ser aplicado por V8)

Si usted es un experto JS y de su ya aplicar todas good practices a su código, hay casi nada que puedas hacer para mejorar el rendimiento.

Si se encuentra con problemas de rendimiento:

  • a verificar
  • Cambiar el código/algoritmo
  • Y como último recurso: escribir una extensión C++ (y ver cada cometen to ri/nodo en GitHub ya que a nadie le importa si algunos cambios internos rompen su construcción)
+0

Gracias - Javascript Garden se ve increíble :) – nornagon

+0

Esta es una publicación anterior, pero recientemente me encontré con un buen video (de Google IO 2012) sobre la cosa exacta. Fue publicado en 2012, así que las cosas han cambiado un poco, pero supongo que no mucho: http://youtu.be/UJPdhx5zTaw – Pijusn

0

Los documentos dan una gran respuesta: http://code.google.com/apis/v8/design.html

+0

Los documentos no son suficientes. por ejemplo: ¿V8 hace inline? ¿Qué tan caro es una llamada a función? ¿Qué tan caro es crear un objeto? Quiero saber cuán inteligente es v8 en una amplia variedad de casos, no solo en los accesos a propiedades. – nornagon

0

Understanding V8 es un conjunto de diapositivas de ninguna decamp.eu y da algunos consejos interesantes. En particular, encontré que las notas sobre cómo evitar el "modo diccionario" son útiles, es decir, ayuda si mantiene constante la "forma" de los objetos y no les agrega propiedades arbitrarias.

También debe ejecutar el nodo con --crankshaft --trace-opt --trace-bailout (el --crankshaft solo se necesita en plataformas de 64 bits, por ejemplo, OS X) para ver si V8 está "rescatando" al JIT ciertas funciones. Hay un montón de otras opciones de rastreo, incluido --trace-gc y varios otros métodos de seguimiento de GC, que pueden ser útiles para la optimización.

Avíseme si tiene alguna pregunta específica sobre las diapositivas anteriores ya que son un tanto concisas. :-) No son míos, pero investigué un poco sobre las áreas que cubren.