2008-10-12 19 views
9

Me preguntaba si había alguna diferencia en la forma en que se compiló el siguiente código en el ensamblaje. He oído que la caja del conmutador es más eficiente que otra cosa, pero en este ejemplo no estoy muy seguro de si ese sería el caso.switch case vs if else

if(x==1){ 
... 
}else if(x==2){ 
... 
}else{ 
... 
} 

y

switch(x){ 
case 1: 
... 
break; 

case 2: 
... 
break; 

default: 
... 
} 
+2

¿Ha considerado obtener el compilador para emitir el ensamblador y comparar el código resultante? –

+0

Para mí, conviene evitar swich-case y utilizar un [hash] (http://hardforo.com/thread-531.html) (matriz asociativa). Es más limpio. – boctulus

+0

Encontré una buena discusión aquí: http://stackoverflow.com/questions/1028437/why-switch-case-and-not-if-else-if – Helene

Respuesta

2

En este caso específico , la switch se puede convertir en una tabla de saltos. El if declaración (si se escribe su = como == :-P) todavía podría hacer lo mismo si el compilador podría decir que x no está cambiando entre las cláusulas if (que suele ser el caso, a menos x es volatile o algo así) .

+0

Esos "==" siempre me atrapan. –

7

Un compilador algunas veces convertirá un interruptor en una tabla de salto, si las entradas son contiguas (o casi). O teóricamente podría usar una búsqueda binaria para encontrar el caso en lugar de una serie lineal de pruebas, que sería más rápido si tuvieras una gran cantidad de casos.

Por otro lado, no hay nada que impida que el compilador realice las mismas optimizaciones en el mismo código convertido a if/else.

Por lo tanto, en un buen compilador, el cambio puede ser más rápido en algunos casos. En un muy buen compilador, serían lo mismo.

3

Tenga en cuenta también que el constructo if/else puede ser más eficiente si sabe que ciertos casos son más probables que otros.

+2

Pero las cajas de interruptores también están ordenadas, ¿no? – user359996

+1

No sé si todos los compiladores garantizan el pedido. Además, el compilador puede crear una tabla de saltos, cuando esto es más o menos eficiente que si se deja/else como ejercicio para el lector. –

+1

¿No debería publicarse como comentario? – FluorescentGreen5