not - Boolean vs Int en Javascript
short circuit javascript (4)
Descargo de responsabilidad, solo puedo hablar de Firefox, pero creo que Chrome es similar.
Primer ejemplo ( http://jsperf.com/bool-vs-int ):
La operación No JägerMonkey (método de JavaScript de Spidmonkey) alinea primero la comprobación de boolean y luego solo xors, que es realmente rápida (no sabemos el tipo de a / b, por lo que necesitamos verificar el tipo). La segunda verificación es para int, por lo que si a / b sería int, esto sería un poco más lento. Code
La operación de resta. De nuevo no sabemos el tipo de c / d. Y otra vez, tienes suerte de que vamos a asumir ints y en línea eso primero. Pero como en JavaScript se especifican las operaciones para que el número de IEEE 754 se duplique, debemos verificar el desbordamiento. Por lo tanto, la única diferencia es "sub" y un "salto condicional" en el desbordamiento frente a xor simple en el caso 1. Code
Segundo ejemplo: (No estoy 100% seguro de esto, porque nunca antes había visto este código)
y 3. El If . Alinear un cheque para booleano, todos los demás casos terminan llamando a una función que convierte el valor en un booleano. Code
La comparación y si . Este es un caso realmente complejo desde el punto de vista de la implementación, porque era realmente importante optimizar las operaciones de igualdad. Así que creo que encontré el código correcto, que parece sugerir que primero verifiquemos el doble y luego los enteros. Y como sabemos que el resultado de una comparación es siempre un valor booleano, podemos optimizar la sentencia
if
. Code
A continuación , descargué el código generado de la máquina, así que si todavía estás interesado, aquí tienes .
En general, esto es sólo una pieza en una imagen más grande. Si supiéramos qué tipo de tipo tenían las variables y sabíamos que la resta no se desbordaría, entonces podríamos hacer que todos estos casos sean igualmente rápidos. Estos esfuerzos se están realizando con IonMonkey o v8''s Crankshaft. Esto significa que debe evitar la optimización basada en esta información, porque:
- ya es bastante rapido
- Los desarrolladores del motor se encargan de optimizarlo para ti.
- Será aún más rápido en el futuro.
Siempre asumí que los booleanos eran más eficientes que los ints para almacenar un valor de activación / desactivación, considerando que esa es la razón de su existencia. Hace poco decidí comprobar si esto es cierto con la ayuda de jsperf, ¡y obtuve algunos resultados contrarios!
Aquí está la primera prueba que probé. Alternar el valor del interruptor de encendido / apagado. En Chrome es significativamente más rápido hacerlo con 1/0, pero en Firefox es un poco más rápido con bool. Interesante.
http://jsperf.com/bool-vs-int-2
Y aquí está la segunda prueba que probé. Usándolos en un condicional. Esto parece tener una ventaja significativa para los ints en lugar de los bools, hasta un 70% más rápido para usar 1/0 en lugar de los booleanos, tanto en Firefox como en Chrome. Wtf?
Supongo que mi pregunta es, ¿estoy haciendo algo mal? ¿Por qué los ints son mucho mejores en el trabajo de Boolean? ¿Es el único valor de usar claridad de bools, o me falta algo importante?
No lo sé, pero en la segunda prueba lo hace.
if(a) bluh();
vs
if(c == 1) bluh();
quizás c==1
es más rápido porque estás comparando un valor con uno del mismo tipo
pero si lo hace if(a)
entonces js debe verificar si el valor se evalúa como verdadero, no solo si es verdadero ...
Esa podría ser la razón...
Tal vez necesitamos probar
if(c==1)
vs
if(a===true)
con tres =
Para mí, la elección se basaría en el uso de API. Siempre devuelve lo que sea más útil. Si uso código secundario, preferiría los métodos que devuelven valores booleanos. Esto probablemente hace que el código esté listo para ser encadenado. La alternativa es proporcionar métodos sobrecargados.
su prueba fue un poco apagada debido a la definición de "función" y "var" y la llamada para la función. El costo de definir la función y las variables y llamarlas diferirá de un motor a otro. Modifiqué sus pruebas, intente volver a ejecutarlas con sus navegadores (tenga en cuenta que IE estaba apagado porque la primera ejecución fue extraña, pero las corridas consecutivas fueron las esperadas donde bool es más rápido): http://jsperf.com/bool-vs-int-2/4