¿Cuáles son los efectos de las excepciones en el rendimiento en Java?

Pregunta: ¿Es realmente lento el manejo de excepciones en Java?

La sabiduría convencional, así como muchos de los resultados de Google, dice que no se debe utilizar una lógica excepcional para el flujo normal de programas en Java. Generalmente se dan dos razones,

  1. es realmente lento, incluso un orden de magnitud más lento que el código normal (las razones dadas varían),

y

  1. es complicado porque la gente espera que solo los errores se manejen en un código excepcional.

Esta pregunta es sobre el n. ° 1.

Como un ejemplo, esta página describe el manejo de excepciones de Java como "muy lento" y relaciona la lentitud con la creación de la cadena del mensaje de excepción: "esta cadena se usa para crear el objeto de excepción que se lanza. Esto no es rápido". El artículo Manejo efectivo de excepciones en Java dice que "la razón de esto se debe al aspecto de creación de objetos del manejo de excepciones, lo que hace que el lanzamiento de excepciones sea inherentemente lento". Otra razón es que la generación de seguimiento de pila es lo que la ralentiza.

Mi prueba (usando Java 1.6.0_07, Java HotSpot 10.0, en Linux de 32 bits), indica que el manejo de excepciones no es más lento que el código normal. Intenté ejecutar un método en un bucle que ejecuta algún código. Al final del método, utilizo un booleano para indicar si debo retorno or lanzar. De esta forma, el procesamiento real es el mismo. Intenté ejecutar los métodos en diferentes órdenes y promediar los tiempos de prueba, pensando que podría haber sido el calentamiento de la JVM. En todas mis pruebas, el lanzamiento fue al menos tan rápido como el retorno, si no más rápido (hasta un 3.1% más rápido). Estoy completamente abierto a la posibilidad de que mis pruebas fueran incorrectas, pero no he visto nada en el camino de la muestra de código, comparaciones de prueba o resultados en el último año o dos que muestren que el manejo de excepciones en Java sea realmente lento.

Lo que me llevó por este camino fue una API que necesitaba usar y que arrojaba excepciones como parte de la lógica de control normal. Quería corregirlos en su uso, pero ahora es posible que no pueda hacerlo. En cambio, ¿tendré que elogiarlos por su visión de futuro?

En el papel Manejo eficiente de excepciones de Java en compilación justo a tiempo, los autores sugieren que la presencia de manejadores de excepciones por sí sola, incluso si no se lanzan excepciones, es suficiente para evitar que el compilador JIT optimice el código correctamente, ralentizándolo. Aún no he probado esta teoría.

preguntado el 18 de noviembre de 08 a las 13:11

Sé que no preguntaba por 2), pero realmente debería reconocer que usar una excepción para el flujo del programa no es mejor que usar GOTO. Algunas personas defienden los gotos, algunas personas defenderían de lo que estás hablando, pero si le preguntas a alguien que ha implementado y mantenido cualquiera de los dos por un período de tiempo, te dirá que ambos son malas prácticas de diseño difíciles de mantener el nombre de la persona que pensó que era lo suficientemente inteligente como para tomar la decisión de usarlos). -

Bill, afirmar que usar excepciones para el flujo del programa no es mejor que usar GOTOs no es mejor que afirmar que usar condicionales y bucles para el flujo del programa no es mejor que usar GOTOs. Es una pista falsa. Explicate tú mismo. Las excepciones pueden y se utilizan de forma eficaz para el flujo de programas en otros idiomas. El código idiomático de Python usa excepciones con regularidad, por ejemplo. Puedo y he mantenido un código que usa excepciones de esta manera (aunque no Java), y no creo que haya nada intrínsecamente malo en ello. -

@mmalone usar Excepciones para el flujo de control normal es una mala idea en Java porque la elección del paradigma se hizo de esa manera. Lea Bloch EJ2; él dice claramente que, cite, (Ítem 57) exceptions are, as their name implies, to be used only for exceptional conditions; they should never be used for ordinary control flow - dando una explicación completa y extensa de por qué. Y el era el chico que escribí Java lib. Por lo tanto, él es quien define el contrato de API de las clases. Estoy de acuerdo con Bill K en esto. -

@ OndraŽižka Si algún marco hace esto (use Excepciones en condiciones no excepcionales), es defectuoso y está roto por diseño, rompiendo el contrato de clase de Excepción del lenguaje. El hecho de que algunas personas escriban código pésimo no lo hace menos pésimo. -

Nadie más que el creador de stackoverflow.com se equivoca sobre las excepciones. La regla de oro del desarrollo de software es nunca hacer que lo simple sea complejo y difícil de manejar. Él escribe: "Es cierto que lo que debería ser un programa simple de 3 líneas a menudo florece a 48 líneas cuando se realiza una buena verificación de errores, pero así es la vida ..." Esta es una búsqueda de pureza, no de simplicidad. -

0 Respuestas

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.