La razón principal por la que Math.floor
es más lento (lo que realmente es, en algunas pruebas que he hecho es más rápido) es que implica una llamada de función. Las implementaciones más antiguas de JavaScript no podían hacer llamadas a funciones en línea. Los motores más nuevos pueden alinear la llamada, o al menos hacer que la búsqueda de la propiedad sea más rápida, pero aún necesitan una condición de protección en caso de que usted (o alguna otra secuencia de comandos) sobrescriba la función Math.floor
. Sin embargo, la sobrecarga es mínima, por lo que no hay mucha diferencia en la velocidad.
Más importante aún, como se mencionó en varios comentarios, los otros métodos no son equivalentes. Todos trabajan haciendo operaciones bit a bit. Los operadores bit a bit convierten automáticamente sus operandos a enteros de 32 bits truncando el número. Eso está bien si el número cabe en 32 bits, pero los números de JavaScript son flotantes de 64 bits, que podrían ser mucho más grandes que 2147483647.
También dan un resultado diferente para números negativos, ya que la conversión a enteros trunca y Math.floor
siempre redondea abajo. Por ejemplo, Math.floor(-2.1) === -3
, pero (-2.1) | (-2.1) === -2
.
Si sabe sólo se trata de un número positivo menor que 2147483648, y que necesita para exprimir cada gota de rendimiento de su código en los navegadores antiguos (Asegúrese de que en realidad es el cuello de botella en primer lugar. Es probable que no es .), Usaría un método aún más simple: x|0
. No evalúa la variable dos veces, y funciona incluso si x
es una expresión (simplemente asegúrese de ponerlo entre paréntesis para que no se encuentre con problemas de precedencia).
'~~ n',' n | n' y 'n & n' no produce el mismo resultado que' Math.floor'. Los primeros tres solo pueden devolver enteros de 32 bits. Pruebe 'n = 50000000000.4'. – kennytm
En mi navegador (FF 3.6.a algo) todos tenían la misma velocidad en los resultados (alrededor de "3", lo que sea que eso signifique). Pruébelo en diferentes navegadores (la pequeña prueba se proporciona en la parte inferior) en lugar de simplemente tomar los resultados por su valor nominal. Realmente no hay ninguna razón por la cual debería ser notablemente más lento. –
En realidad, ejecutar su punto de referencia en FF 3.6 muestra que 'Math.floor' es el más rápido –