tips speed slow fast current javascript performance

javascript - speed - ¿Qué es más rápido: Math.abs(valor) o value*-1?



performance html (5)

Bastante sencillo, pero solo quiero saber cuál es más rápido.

Creo que simplemente multiplicar un número por -1 es mucho más rápido que llamar a un método predefinido, siempre que esté seguro de que el valor es negativo.

Pero si ese es el caso, ¿para qué sirve la función abs() ? ¿Es simplemente para asegurarse de que el valor devuelto siempre sea positivo independientemente del signo del valor?


Solo la operación *-1 es probablemente más rápida, pero tenga en cuenta que el resultado final difiere del resultado de math.abs ().

math.abs(-5) y math.abs(5) ambos devuelven 5.

-5 * -1 devuelve 5.

5 * -1 devuelve -5.

Entonces, a menos que esté absolutamente seguro de que el número es negativo para empezar, debe hacer algunas pruebas, que le costarán más tiempo. También podría hacer math.abs ().

Pero realmente, si la diferencia de rendimiento entre abs () y * -1 importa en su JS, es probable que tenga problemas más serios.


Sugeriría elegir el método que muestre más claramente tu intención, en lugar de preocuparte por el rendimiento. En este caso, la ganancia de rendimiento de multiplicar por -1 es probablemente mínima.

Cuando usa Math.abs() , está muy claro que quiere un valor positivo. Cuando usa * -1 no está claro, y requiere más investigación para determinar si el valor de entrada es siempre negativo.


Supongo que depende de la implementación, pero Math.abs podría ser tan simple como:

function abs(x) { return x < 0 ? x * -1 : x; }

Entonces, en teoría, solo agrega una prueba rápida antes de multiplicarse.

Pero, sí, negar un signo negativo es el único propósito. El punto es que un simple x * -1 también es contraproducente para valores positivos.

@olliej [comentarios]

Cierto. Edición simple, sin embargo. ;)

function abs(x) { return Number(x < 0 ? x * -1 : x); }


Una pregunta de estilo: ¿Por qué usar a * -1 lugar de -a ? Aparte de eso, acepto que debes usar abs() si no sabes el signo del número de antemano. No me importaría la velocidad, sino la legibilidad.


Actualizado agosto de 2012 :

Hice algunos perfiles con estas implementaciones:

/* Test 1: */ b = Math.abs(a); /* Test 2: */ b = abs(a); //local copy: abs = Math.abs; /* Test 3: */ b = a < 0 ? a * -1 : a; /* Test 4: */ b = a < 0 ? -a : a;

Obtuve el siguiente resultado en Windows 7. Los valores se normalizan después del resultado más rápido por navegador para que sea más fácil comparar qué método es más rápido:

1:Math 2:abs 3:*-1 4:- 1.0= Version Chrome 1.0 1.0 1.0 1.0 111ms 21.0.1180.75 m Firefox 1.0 1.0 1.2 1.2 127ms 14.0.1 IE 1.4 1.0 1.1 1.0 185ms 9.0.8112 Opera 1.9 1.6 1.1 1.0 246ms 12.00 Safari 1.6 1.6 1.1 1.0 308ms 5.1.7

Conclusión: cuando hice esta prueba hace 3 años, -a fue más rápido, pero ahora Math.abs (x) es más rápido en Firefox. En Chrome abs(a) y -a obtuve el mismo tiempo y solo hubo 3 ms de diferencia con el método más lento cuando lo probé con 10 000 000 de números.

Mi recomendación : use Math.abs (a) . Si se encuentra en un círculo cerrado y si el perfil le parece demasiado lento, puede usar una referencia local a la función abs:

var abs=Math.abs; //A local reference to the global Math.abs function for (i=0;i<1234567890;++i) if ( abs( v[i] ) > 10) ++x;