switch else performance switch-statement if-statement

performance - switch - Case vs If Else If: ¿Cuál es más eficiente?



if vs switch (7)

Creo que como los casos deben ser valores constantes, la instrucción switch hace el equivalente de un goto, por lo que, en función del valor de la variable, salta al caso correcto, mientras que en el enunciado if / then debe evaluar cada expresión.

Posibles duplicados:
es "else if" más rápido que "switch () case"?
¿Cuál es el rendimiento relativo del interruptor if / else vs. en Java?

He estado codificando otra vez ... cuando el depurador pasa por una declaración de caso, salta al elemento que coincide con las condiciones de inmediato, sin embargo, cuando se especifica la misma lógica usando if / else, recorre cada declaración if hasta que encuentre el ganador. ¿Es la declaración del caso más eficiente, o mi depurador está optimizando el paso? (No te preocupes por la sintaxis / errores, escribí esto en SO, no sé si se compilará, es el principio que busco, no quise hacerlos porque causó vagamente recordar algo sobre caso usando un desplazamiento con enteros) Uso C #, pero estoy interesado en una respuesta general en todos los lenguajes de programación.

switch(myObject.GetType()){ case typeof(Car): //do something break; case typeof(Bike): //do something break; case typeof(Unicycle): //do something break; case default: break; }

VS

Type myType = myObject.GetType(); if (myType == typeof(Car)){ //do something } else if (myType == typeof(Bike)){ //do something } else if (myType == typeof(Unicycle)){ //do something } else{ }


Creo que es solo el depurador lo que lo hace simple. Tenga en cuenta que un caso y "si lista" no son en última instancia lo mismo. Existe una razón por la cual los bloques de casos normalmente terminan con "interrupción". El estuche se parece en realidad a algo así cuando se rompe en el montaje.

if myObject.GetType() == type of Car GOTO START_CAR else if myObject.GetType() == type of Bike GOTO START_BIKE LABEL START_CAR //do something car GOTO END LABEL START_BIKE //do something bike GOTO END LABEL END

Si no tiene el receso, a los bloques de casos les faltarán los "GOTO END" stmts, y de hecho si aterrizaran en el caso "car", en realidad ejecutarían ambas secciones

//do something car //do something bike GOTO END


El depurador lo está simplificando, porque no desea pasar por el código real que crea el compilador.

Si el conmutador contiene más de cinco elementos, se implementa utilizando una tabla de búsqueda o una tabla hash; de lo contrario, se implementará utilizando if ... else.

Ver la pregunta estrechamente relacionada es "else if" más rápido que "switch () case"? .

Por supuesto, otros lenguajes distintos de C # lo implementarán más o menos de manera diferente, pero un cambio generalmente es más eficiente.


La Wikipedia de Wikipedia es bastante grande y, de hecho, bastante buena. Puntos interesantes:

  • Los interruptores no son inherentemente rápidos. Depende del idioma, el compilador y el uso específico.
  • Un compilador puede optimizar los conmutadores utilizando tablas de salto o punteros de función indexados.
  • La declaración fue inspirada por algunas matemáticas interesantes de Stephen Kleene (y otros).

Para una optimización extraña e interesante usando un interruptor C, consulte el Dispositivo de Duff .


Muchos lenguajes de programación optimizan la instrucción switch de modo que es mucho más rápida que una estructura if-else estándar si los casos son constantes del compilador. Muchos idiomas usan una tabla de salto o una tabla de bifurcaciones indexada para optimizar las declaraciones de cambio. Wikipedia tiene una buena discusión sobre la declaración de cambio. Además, here hay una discusión sobre la optimización de conmutadores en C.

Una cosa a tener en cuenta es que se pueden abusar las declaraciones de cambio y, dependiendo del caso, puede ser preferible usar polimorfismo en lugar de declaraciones de cambio. Vea here para un ejemplo.


Parece que el compilador optimiza mejor una instrucción de conmutación que una instrucción de instrucción if.

El compilador no sabe si el orden de evaluar los enunciados if es importante para usted, y no puede realizar ninguna optimización allí. Podría estar llamando a métodos en los enunciados if, que influyen en las variables. Con la declaración de cambio, sabe que todas las cláusulas se pueden evaluar al mismo tiempo y puede ponerlas en el orden que sea más eficiente.

Aquí hay una pequeña comparación:
http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx