2012-01-16 16 views
5

Estoy trabajando en una aplicación de JavaScript que hace un uso intensivo de las operaciones matemáticas, docenas de llamadas por movimiento de mouse. He estado trabajando en el código de la gente de los demás como punto de partida, y me encuentro a menudo arounds de trabajo para la matemáticas Javascript nativa, tales como ...Velocidad del objeto matemático en Javascript

var pi = Math.PI 
var distance = (x * x) + (y * y)/R * R 
var pixels = ~~(x/y) 

¿Existe un significativo impacto en el rendimiento para el uso del objeto Math ? Si es así, ¿cuáles son algunas soluciones comunes?

+1

Probablemente los métodos 'Math' se implementan en el lenguaje en el que javascript está implementado (es decir, C o C++ en un navegador típico) por lo que son mucho más rápidos que lo que puede escribir en Javascript –

+5

¿Ha ** medido ** diferencia en el rendimiento? ¿A través de todos tus navegadores objetivo? –

+2

Bueno 'Math' no tiene un método de" distancia ", y esa conversión entera puede ser más rápida pero también es semánticamente diferente de' Math.floor() 'o' Math.round() '. Puede usar [jsperf] (jsperf.com) para probar este tipo de cosas. – Pointy

Respuesta

15

Si por alguna razón hacer el cálculo de la materia intensiva en javascript, debe recordar esas cosas (* y leer de David Mandelin Sepa sus motores: Cómo hacer que su JavaScript rápida presentación - PDF, donde describe esto con más detalles *):

  1. en línea todo lo que pueda.

  2. llamadas a funciones son muy caros

  3. acceso a objetos es caro

  4. polimorfismo puede costar rendimiento, sus variables y argumentos debe sujetarse siempre sólo un tipo de datos.

objeto Math no es especialmente lento, pero que no encontrará distance() función allí de todos modos, y acceder a sus métodos de cierre a través de las llamadas es Math.method(), ineficiente.

por lo sqrt es, por supuesto, peor que x*x, a medida random función podría ser mejor para usted, Pi debe almacenar en caché en los bucles, min y max probablemente se debe evitar, así, ninguna idea acerca de la trigonometría y logaritmos de velocidad .


P.S .: Puede hacer cosas como ((x >= 0 ? x : -x) + 0.5) >> 0, para reemplazar Math.ceil(Math.abs()), pero recuerda - cuando digo "intensivo" - estoy hablando de procesamiento de números, procesamiento de datos, la física, gráficos y cosas por el estilo. Para sitios normales de JavaScript o RIA, usted no debe hacer cosas que estoy sugiriendo aquí. Además, la mayoría de los hacks de velocidad tienen su side effects

+0

Con respecto al punto 4 ... Realmente no entiendo. No puede evitar el tipado de patos en JS con objetos, por lo que no puede evitar el polimorfismo con objetos. Una búsqueda es una búsqueda, por lo que me parece lo mismo que el punto 3. –

+0

Gracias por los consejos, lo revisé y parece que se puede obtener más de la arquitectura que las microoptimizaciones. Mi código está relacionado con los gráficos, así que necesito exprimir un poco el rendimiento. – Duopixel

0

No estoy de acuerdo con las llamadas de función. if las sentencias dentro de las sentencias if y las funciones especializadas largas son más lentas que el código bien organizado con muchas funciones pequeñas generalizadas.

Cuestiones relacionadas