2010-08-02 26 views
9

duplicados posibles:
Is "else if" faster than "switch() case"?
What is the relative performance difference of if/else versus switch statement in Java?sentencia-case o perspectiva de la eficiencia sentencia if

Sé que las declaraciones de casos pueden implementarse con tablas de salto. ¿Esto los hace más eficientes que las declaraciones if?

¿Es esto solo una micro-optimización que debe evitarse?

+2

Dupe de [es "else if" más rápido que "switch() caso "?] (http://stackoverflow.com/questions/767821/is-else-if-faster-than-switch-case), [¿Cuál es la diferencia relativa de rendimiento de if/else versus la instrucción switch en Java?] (http://stackoverflow.com/questions/2086529/what-is-the-relative-performance-difference-of-if-else-versus-switch-statement-in), [If vs. Switch Speed] (http://stackoverflow.com/questions/445067/if-vs-switch-speed), etc. – BalusC

+0

Eso no es un dup porque esta pregunta es específica de java. – sixtyfootersdude

+1

En realidad, tienes razón. Este es un duplicado de http://stackoverflow.com/questions/2086529/what-is-the-relative-performance-difference-of-if-else-versus-switch-statement-in. Aunque no es un duplicado de los otros porque no son específicos de Java. Molesto cómo la eficiencia y el rendimiento son etiquetas diferentes. – sixtyfootersdude

Respuesta

35

Creo que lo principal es escribir el código lo más claramente posible. Las micro optimizaciones como esta no deberían ser el centro de atención.

Por ejemplo, si tiene algo como esto:

if (age == 10) { 
    // ... 
} else if (age == 20) { 
    // ... 
} else if (age == 30) { 
    // ... 
} else if (age == 40) { 
    // ... 
} 

Entonces es más claro para utilizar una sentencia switch:

switch (age) { 
    case 10: 
     // ... 
     break; 
    case 20: 
     // ... 
     break; 
    case 30: 
     // ... 
     break; 
    case 40: 
     // ... 
     break; 
} 

Una vez más, me gustaría centrarse en hacer el código más fácil de leer y mantener en lugar de ganancias de eficiencia de nivel nano-segundo.

0
  1. No, es parte de su programa de diseño. Pero debe considerar si un método sobre-ridable podría no ser una solución aún mejor, con una familia de tipos.
2

Si tuviera un muy grande cadena de si else, entonces, sí, te pueden sentir la diferencia. Pero es muy poco realista que alguna vez escribas una cadena de ifelse tan larga. Y si lo hizo, es muy poco probable que sea allí donde se encuentre el cuello de botella de su rendimiento.

Primero, escriba su código para ser legible y déjese guiar por un generador de perfiles cuando surja la necesidad de optimizar el rendimiento.

3

Cualquier compilador realizará la tabla de salto si puede verificar que los valores sean razonablemente compactos. (Dudo si están en este caso, siendo múltiplos de 10.)

Esto es una micro-optimización. La micro optimización solo tiene sentido si sabes que sí. Típicamente, hay "peces para freír" más grandes en otros lugares, en forma de llamadas a función de las que se podría hacer sin ellas. Sin embargo, si ya ha desactivado las luces del día de este código, y su perfil muestra que una buena fracción (como el 10% o más) de tiempo va a estas declaraciones IF (y no a sus contenidos), entonces ayuda. Esto puede suceder, por ejemplo, en un intérprete de código de bytes.

Agregado: Otra razón por la que me gusta usar switch es, incluso si no hace una tabla de saltos: al pasar por el código en un depurador, va directamente al caso apropiado, en lugar de hacerme pasar por un muchas declaraciones falsas if. Lo hace más fácil de depurar.

1

Probablemente no es importante. Bytecode es solo un "formato de transporte" para la JVM. Lo que sucede dentro de la JVM es muy diferente de la representación del bytecode.(Ejemplo: Bytecode no ofrece operaciones de flotación, por lo que flotación + - * /% float se realiza como operaciones dobles y luego el resultado se vuelve a flotar. Lo mismo vale para byte/short, se convierten a int y luego a back .) Pero para el cambio son dos formatos de bytecode, uno ya con una tabla de salto. Pero, sinceramente, elegiría el formato que sea mejor para usted y para el lector de su programa. La JVM hará el resto. Si eres demasiado inteligente, quizás JVM no entienda tu punto y, al final, el programa es más lento.

"Debemos olvidarnos de pequeñas eficiencias, por ejemplo alrededor del 97% del tiempo: la optimización prematura es la raíz de todo mal" D. Knuth

Cuestiones relacionadas