¿Por qué el manejo de excepciones de Java afecta el rendimiento?
Sí, las excepciones son caras. Entonces, ¿significa esto que no deberías utilizar excepciones? Por supuesto que no. Pero, ¿cuándo deberías utilizar excepciones y cuándo no? Desafortunadamente, la respuesta no está clara de inmediato. Lo que estamos diciendo es que no tiene que renunciar a los buenos hábitos de programación try-catch que ha aprendido, pero puede tener problemas al trabajar con excepciones, y la creación de excepciones es un ejemplo. Cuando se crea una excepción, se debe recopilar un seguimiento de la pila, que describe dónde se creó la excepción. ¿Recuerda el seguimiento de la pila que vio cuando se produjo una excepción inesperada en su código? Como lo siguiente: Excepción en el hilo "principal" my.corp.DidntExpectThisException en T.noExceptionsHere(T.java:13) en T.main(T.java:7) Excepción en el hilo "principal" my.corp.DidntExpectThisException en T .noExceptionsHere(T.java: 13) en T.main(T.java: 7) La creación de estos seguimientos de pila requiere una instantánea de la pila en tiempo de ejecución, y es esta parte la que es costosa. La pila de tiempo de ejecución no está diseñada para la creación eficiente de excepciones, pero está diseñada para hacer que el tiempo de ejecución se ejecute lo más rápido posible. Empuja, pop, empuja, pop. Dejemos que un trabajo como este se realice sin problemas y sin demoras innecesarias. Sin embargo, cuando es necesario crear una excepción, la JVM tiene que decir: "No te muevas todavía, quiero guardar una instantánea de tu apariencia actual, así que detén temporalmente las operaciones de inserción y extracción y espera a que termine". tomando la instantánea con una sonrisa. "El seguimiento de la pila no solo contiene uno o dos elementos en la pila en tiempo de ejecución, sino todos los elementos de la pila, de arriba a abajo, junto con los números de línea y todo lo demás. Si crea una excepción en una pila con una profundidad de 20, no espere registrar solo los primeros elementos de la pila: debe registrar los 20 elementos. Registre toda la pila desde main o Thread.run (en la parte inferior de la pila) hasta la parte superior de la pila. Por tanto, crear excepciones es caro. Técnicamente, la instantánea del seguimiento de la pila se produce en el método nativo Throwable.fillInStackTrace(), que a su vez se llama desde el constructor Throwable. Pero no importa: si creas una Exception, pagas el precio. Afortunadamente, detectar excepciones no es costoso, por lo que puedes usar try-catch para empaquetar el contenido principal. También puede definir una cláusula throws en la definición del método sin ninguna penalización en el rendimiento, por ejemplo: public Blah myMethod(Foo x) throws SomeBarException { .... public Blah myMethod(Foo x) throws SomeBarException { ... .Técnicamente, usted Incluso puede lanzar excepciones a voluntad sin arruinarse. No es la operación de lanzamiento la que genera una penalización de rendimiento, aunque es un poco inusual lanzar una excepción sin crearla primero. Lo que realmente cuesta dinero es crear excepciones.
try { doThings(); if (true) throw new SomeException(); // porque mi programa se ejecuta demasiado rápido } catch(SomeException e) { doMoreThings() } try { doThings(); ); //porque mi programa se ejecuta demasiado rápido } catch(SomeException e) { doMoreThings() } Afortunadamente, los buenos hábitos de programación nos han enseñado que no debemos lanzar excepciones independientemente de las circunstancias. Las excepciones están diseñadas para situaciones inusuales y este principio debe tenerse en cuenta al utilizarlas. Pero en caso de que no quieras seguir buenas prácticas de programación, el lenguaje Java te anima a hacerlo haciéndote saber que hacerlo hará que tu programa se ejecute más rápido.