script que pantalla pagina origen llamar funcion finalizar fallado evento esperar ejecutar con cargue cargando carga javascript performance switch-statement

que - llamar funcion javascript html sin evento



anidar ''cambiar'' casos en javascript: ¿cualquier ventaja de velocidad? (4)

pregunta de novato aquí: Tengo un ''interruptor'' que contiene numerosas cadenas. ¿Hay una ventaja de velocidad al dividirlo alfabéticamente, así?

switch(myString.substring(0,1)){ case "a" : switch(myString){ case "a string beginning with a" : runCode(); break; case "another string beginning with a" : runCode(); break; } break; case "b" : switch(myString){ case "by golly another string" : runCode(); break; case "blimey - hundreds of strings" : runCode(); break; //... etc

¿O un lenguaje con guiones lee cada línea de todos modos, solo para encontrar los corchetes cerrados?


No creo que le importe esa optimización. Diría que es mejor crear un objeto con las funciones que se ejecutarán, para que no necesite un código de búsqueda exesivo, sino algo como esto:

var obj = { "aa": runCode, "ab": something, "ba": foo, "bb": bar };

Luego puede ejecutar solo con esto, en lugar de switch dentro de los switch . Buscará la función correcta internamente, lo que realmente creo es más rápido que hacer esas cosas usted mismo:

obj[myString]();


No he ejecutado benchmarks en las versiones JS, pero sé que en PHP hay una ligera desventaja al usar switch vs. if / else pero la diferencia es insignificante y en ciertas condiciones se gana en legibilidad / mantenibilidad lo que se pierde en velocidad ( En mi humilde opinión).

Dicho esto, no creo que ganes nada en velocidad aquí a menos que tengas más probabilidades de tener resultados a, b, c que x, y, z. Al evaluar las declaraciones de casos, el analizador evaluará cada caso hasta que encuentre una coincidencia y luego desciende a ese código.

Entonces, si tiene respuestas que surgen con más frecuencia que otras y las coloca en la cima, técnicamente ahorraría tiempo en la evaluación, pero creo que el tiempo ahorrado sería insignificante. Es decir, un bucle de referencia sobre ello un par de miles de veces probablemente mostraría diferencias de microsegundos. Soy demasiado perezoso para probar eso, pero esa es mi mejor conjetura sobre eso.

Y las declaraciones de cambio de nido generalmente se evitan, ya que no son muy bonitas y pueden ser difíciles de leer, lo que puede generar errores o la frustración de los compañeros de trabajo. :)


Si y no. Vería un aumento de velocidad mínimo, pero no vale la pena la legibilidad de código perdida de este tipo de estructura. Una instrucción switch es como un bloque gigante de declaraciones if-else. Tiene que ir de un caso a otro hasta que encuentre lo que está buscando, al igual que con la estructura if-elseif-else equivalente. Por lo tanto, todo lo que hace es ayudarlo a omitir un puñado de condiciones. Las instrucciones de conmutación anidadas, especialmente la forma escrita aquí, son menos legibles para la mayoría de los desarrolladores que una jerarquía vertical if-elseif-else.


Supongo que la respuesta correcta podría medirse empíricamente, y podría variar de un motor de ejecución de JavaScript a otro.

Básicamente, tenemos que ver cuál es el mejor caso en el que la compilación del script podría compilarse en términos de pseudo código.

El peor caso sería un conjunto secuencial ingenuo de comparaciones de cuerdas, es decir, evalúa secuencialmente cada case lable haciendo una comparación de cuerdas. Con todas las afirmaciones de velocidad de los últimos años, dudo que alguno de los principales motores lo haga, a menos que el número de etiquetas de casos son pocas (digamos 2 o 3).

Para el número lager de etiqueta de caja, la mejor velocidad de ejecución sería que el motor primero creara una tabla hash de todas las etiquetas de caja (hecha una vez cuando se carga el script), y luego cuando se ejecute la instrucción switch, calcule el valor hash de la entrada y busca un conjunto de posibles valores objetivo para la comparación final de cadenas.

Si el motor de ejecución hace esto, entonces el anidamiento de la instrucción switch realmente duplicará el tiempo empleado y, por lo tanto, disminuirá la velocidad de ejecución.

Así que, en general, para los motores javascript modernos (los que se usan en los navegadores), confíe en que el sistema hará lo correcto sin crear código ilegible, para los viejos y oscuros motores javascript (los que usan servidores que no son Node.JS) prueban qué tú lo haces.