top surveys stackoverflow programming popular most languages development java performance if-statement case-statement

java - programming - stackoverflow surveys



case-statement o if-statement efficiency perspective (5)

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

Posibles duplicados:
¿Es "else if" más rápido que "switch () case"?
¿Cuál es la diferencia relativa de rendimiento de if / else versus la instrucción switch en Java?

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

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


Cualquier compilador creará 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í. Por lo general, hay "peces para freír" más grandes en otros lugares, en forma de llamadas a funciones que podrían hacerse sin él. 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 el switch es, incluso si no hace una tabla de saltos: al pasar por el código en un depurador, va directamente al caso adecuado, en lugar de hacerme pasar por un montón de errores if declaraciones. Lo hace más fácil de depurar.


Probablemente no importa. 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.

"Deberíamos olvidarnos de las pequeñas eficiencias, digamos el 97% del tiempo: la optimización prematura es la raíz de todo mal" D. Knuth


Si tuvieras una gran cadena de declaraciones if else, entonces, sí, podrías 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 que sea legible y déjese guiar por un generador de perfiles cuando surja la necesidad de optimizar el rendimiento.


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 está más claro usar una declaración de cambio:

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

Una vez más, me centraría en hacer que el código sea más fácil de leer y mantener en lugar de ganancias de eficiencia de nano segundos niveles.