¿Es "si no" más rápido que "caso switch()"? [duplicar]

Resuelto Ivan Prodanov asked hace 15 años • 14 respuestas

Soy un ex Pascal y actualmente estoy aprendiendo C#. Mi pregunta es la siguiente:

¿El siguiente código es más rápido que hacer un cambio?

int a = 5;

if (a == 1)
{
    ....
}
else if(a == 2)
{
    ....
}
else if(a == 3)
{
    ....
}
else if(a == 4)
{
    ....
}
else
    ....

Y el interruptor:

int a = 5;

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

    case 2:
        ...
        break;

    case 3:
        ...
        break;

    case 4:
        ...
        break;

    default:
        ...
        break;


}

¿Cuál es más rápido?

Lo pregunto porque mi programa tiene una estructura similar (muchas, muchas declaraciones "si no"). ¿Debería convertirlos en interruptores?

Ivan Prodanov avatar Apr 20 '09 18:04 Ivan Prodanov
Aceptado

Para unos pocos artículos, la diferencia es pequeña. Si tienes muchos artículos, definitivamente deberías usar un interruptor.

Si un modificador contiene más de cinco elementos, se implementa mediante una tabla de búsqueda o una lista hash. Esto significa que todos los elementos obtienen el mismo tiempo de acceso, en comparación con una lista de if:s donde el último elemento tarda mucho más en llegar, ya que primero tiene que evaluar todas las condiciones anteriores.

Guffa avatar Apr 20 '2009 11:04 Guffa

¿Por qué te importa?

El 99,99% de las veces, no debería importarte.

Es poco probable que este tipo de microoptimizaciones afecten el rendimiento de su código.

Además, si NECESITAS que te importe, entonces deberías realizar un perfil de rendimiento en tu código. En cuyo caso, descubrir la diferencia de rendimiento entre un caso de cambio y un bloque if-else sería trivial.

Editar: en aras de la claridad: implemente el diseño que sea más claro y más fácil de mantener. Generalmente, cuando nos enfrentamos a una caja de interruptor enorme o a un bloque if-else, la solución es utilizar polimorfismo. Encuentre el comportamiento que está cambiando y encapsúlelo. He tenido que lidiar con códigos de cajas de cambios enormes y feos como este antes y, en general, no es tan difícil de simplificar. Pero tan satisfactorio.

Wedge avatar Apr 20 '2009 11:04 Wedge

Según esta evaluación de rendimiento , el caso del cambio es más rápido.

Esta es la conclusión:

Los resultados muestran que la instrucción switch es más rápida de ejecutar que la escalera if-else-if. Esto se debe a la capacidad del compilador para optimizar la declaración de cambio. En el caso de la escalera if-else-if, el código debe procesar cada instrucción if en el orden determinado por el programador. Sin embargo, debido a que cada caso dentro de una declaración de cambio no depende de casos anteriores, el compilador puede reordenar las pruebas de tal manera que proporcione la ejecución más rápida.

Michael Klement avatar Apr 20 '2009 11:04 Michael Klement

Otra cosa a considerar: ¿es este realmente el cuello de botella de su aplicación? Hay casos extremadamente raros en los que realmente se requiere una optimización de este tipo. La mayoría de las veces puedes conseguir aceleraciones mucho mejores repensando tus algoritmos y estructuras de datos.

Vilx- avatar Apr 20 '2009 11:04 Vilx-