Chicos, tengo un par de preguntas:
- ¿Hay una diferencia de rendimiento en JavaScript entre una
switch
declaración y unaif...else
? - Si es así, ¿por qué?
- Es el comportamiento de
switch
yif...else
diferentes a través de los navegadores? (Firefox, IE, Chrome, Opera, Safari)
La razón para hacer esta pregunta es que parece que obtengo un mejor rendimiento en una switch
declaración con aproximadamente 1000 casos en Firefox.
Editado Desafortunadamente este no es mi código, el Javascript se está produciendo en el servidor desde una biblioteca compilada y no tengo acceso al código. El método que produce el javascript se llama
CreateConditionals(string name, string arrayofvalues, string arrayofActions)
note arrayofvalues
es una lista separada por comas.
lo que produce es
function [name] (value) {
if (value == [value from array index x]) {
[action from array index x]
}
}
Nota: where [name]
= el nombre pasado a la función del servidor
Ahora cambié la salida de la función para insertarla en un TextArea, escribí un código JavaScript para analizar la función y la convertí en un conjunto de case
declaraciones.
Finalmente ejecuto la función y funciona bien, pero el rendimiento difiere en IE y Firefox.
fuente
Respuestas:
Respondiendo en generalidades:
Sitio de prueba
fuente
switch
y lasif/then
declaraciones en JS. El artículo establece que esto se debe a laswitch
optimización irregular y a las diferentes formas en que funcionan los diferentes motores JS. Cita:Since most JavaScript engines don’t have such optimizations, performance of the switch statement is mixed.
A veces es mejor no usar ninguno. Por ejemplo, en una situación de "despacho", Javascript le permite hacer las cosas de una manera completamente diferente:
La configuración de la ramificación multidireccional mediante la creación de un objeto tiene muchas ventajas. Puede agregar y eliminar funcionalidades dinámicamente. Puede crear la tabla de despacho a partir de datos. Puedes examinarlo mediante programación. Puede construir los manejadores con otras funciones.
Existe la sobrecarga adicional de una llamada de función para llegar al equivalente de un "caso", pero la ventaja (cuando hay muchos casos) de una búsqueda hash para encontrar la función para una tecla en particular.
fuente
La diferencia de rendimiento entre una
switch
yif...else if...else
es pequeña, que, básicamente, hacer el mismo trabajo. Una diferencia entre ellos que puede marcar la diferencia es que la expresión a probar solo se evalúa de vez enswitch
cuando, se evalúa para cada unoif
. Si es costoso evaluar la expresión, hacerlo una vez es, por supuesto, más rápido que hacerlo cien veces.La diferencia en la implementación de esos comandos (y todos los scripts en general) difiere bastante entre los navegadores. Es común ver diferencias de rendimiento bastante grandes para el mismo código en diferentes navegadores.
Como difícilmente puede probar el rendimiento de todo el código en todos los navegadores, debe buscar el código que mejor se adapte a lo que está haciendo e intentar reducir la cantidad de trabajo realizado en lugar de optimizar cómo se hace.
fuente
Básicamente, use lo que haga que el código sea más legible. Definitivamente, hay lugares donde una u otra construcción hace que sea más limpio, más legible y más fácil de mantener. Esto es mucho más importante que quizás guardar algunos nanosegundos en el código JavaScript.
fuente
if..else
yswitch
causada por una combinación única de hardware de computadora y sistema operativo.Además de la sintaxis, se puede implementar un interruptor utilizando un árbol que lo hace
O(log n)
, mientras que un if / else debe implementarse con unO(n)
enfoque de procedimiento. Más a menudo, ambos se procesan procesalmente y la única diferencia es la sintaxis, y además, ¿realmente importa, a menos que esté escribiendo estáticamente 10k casos de if / else de todos modos?fuente
La respuesta de Pointy sugiere el uso de un objeto literal como alternativa a
switch
oif
/else
. También me gusta este enfoque, pero el código en la respuesta crea un nuevomap
objeto cada vezdispatch
que se llama a la función:Si
map
contiene una gran cantidad de entradas, esto puede generar una sobrecarga significativa. Es mejor configurar el mapa de acción solo una vez y luego usar el mapa ya creado cada vez, por ejemplo:fuente
No lo creo,
switch
es útil / breve si quieres prevenir múltiplesif-else
afecciones.El comportamiento es el mismo en todos los navegadores :)
fuente
switch is useful/short if you want prevent multiple if-else conditions.
Sí señor, gran publicación.fuente
Resulta que si, si no, generalmente es más rápido que cambiar
http://jsperf.com/switch-if-else/46
fuente