El bloque try-catch disminuye el rendimiento [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Este enlace establece,

Para capturar excepciones debemos colocar una porción del código bajo excepción inspección. Esto se hace encerrando esa porción de código en un intento bloque. Cuando un circunstancia excepcional surge dentro de ese bloque, un se lanza la excepción que transfiere el control a la excepción handler. Si no se lanza ninguna excepción, el código continúa normalmente y todos los controladores son ignorados.

¿Significa que tener un bloque de prueba reduce el rendimiento debido a la tarea adicional de "inspección" durante el tiempo de ejecución?

Author: razlebe, 2013-05-28

5 answers

TL;DR NO, las excepciones son generalmente más rápidas en la ruta no excepcional en comparación con el manejo de código de error.


Bueno, la observación obvia es en comparación con qué ?

En comparación con no manejar el error, obviamente disminuye el rendimiento; pero ¿vale la pena la falta de corrección ? Yo diría que no lo es, así que supongamos que quiere decir en comparación con un código de error comprobado con una instrucción if.

En este caso, depende. Alli son múltiples mecanismos utilizados para implementar excepciones. En realidad, se pueden implementar con un mecanismo tan cercano a una declaración if que terminan teniendo el mismo costo (o un poco más alto).

En C++, sin embargo, todos los compiladores principales (gcc lo introdujo en 4.serie x, MSVC lo usa para código de 64 bits) ahora use el Modelo de Excepción de Costo Cero. Si lee este documento técnico al que Need4Sleep está vinculado, aparece como el enfoque basado en tablas. La idea es que para cada punto de la programa que puede lanzar a registrar en una mesa lateral algunos bits y piezas que le permitirán encontrar la cláusula de captura correcta. Honestamente, es un poco más complicado en cuanto a la implementación que las estrategias más antiguas, sin embargo, el nombre de Costo cero se deriva del hecho de que es libre no debe lanzarse ninguna excepción. Contrasta esto con una mala predicción de rama en una CPU. Por otro lado, cuando se lanza una excepción, entonces la penalización es enorme porque la tabla se almacena en un frío zona (por lo que probablemente requiere un viaje de ida y vuelta a RAM o peor)... pero las excepciones son excepcionales, ¿verdad ?

En resumen, con los compiladores C++ modernos las excepciones son más rápidas que los códigos de error, a costa de binarios más grandes (debido a las tablas estáticas).


En aras de la exhaustividad, hay una tercera alternativa: el aborto. En lugar de propagar un error a través de estado o excepción, es posible abortar el proceso en su lugar. Esto solo es adecuado en un número restringido de situaciones, sin embargo, optimiza mejor que cualquiera de las dos alternativas.

 60
Author: Matthieu M.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-26 08:55:06

Eche un vistazo a la Sección 5.4 de borrador del Informe Técnico sobre el Rendimiento de C++ que se trata específicamente de la sobrecarga de las sentencias try-catch en c++.

Un pequeño extracto de la sección:

5.4.1.1.2 Sobrecarga temporal del Enfoque" Código "

• On entry to each try-block
    ♦ Commit changes to variables enclosing the try-block
    ♦ Stack the execution context 
    ♦ Stack the associated catch clauses 
• On exit from each try-block
    ♦ Remove the associated catch clauses 
    ♦ Remove the stacked execution context 
• When calling regular functions 
    ♦ If a function has an exception-specification, register it for checking 
• As local and temporary objects are created 
    ♦ Register each one with the current exception context as it is created 
• On throw or re-throw 
    ♦ Locate the corresponding catch clause (if any) – this involves some runtime check (possibly resembling RTTI checks) 
    If found, then: 
    destroy the registered local objects 
    check the exception-specifications of the functions called in-between 
    use the associated execution context of the catch clause 
    Otherwise: 
    call the terminate_handler6
 6
Author: Syntactic Fructose,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-28 05:47:27

Depende. Para el manejo de excepciones, el compilador tiene que hacer algo - de lo contrario no podría hacer el desbobinado de la pila y cosas así. Eso significa que sí, el manejo de excepciones disminuye el rendimiento, incluso si la excepción no se lanza. Cuánto-esto depende de la implementación de los compiladores.

Por otro lado, usted tiene que preguntarse: Si inserta su código de manejo de errores usted mismo, sería realmente más rápido (mídalo, no lo adivine). Puede hacer lo mismo que las excepciones (excepciones no puede ser ignorado por el cliente-los códigos de error pueden-y pueden hacer stackunwinding que los códigos de error no pueden). Además, el código se puede escribir para ser más mantenible con excepciones.

Corto: a menos que su código sea muy, muy, muy, muy crítico con el tiempo, use excepciones. Incluso si usted decide en contra de ellos: medir primero. Una excepción a la regla: es una mala idea lanzar excepciones a través de los límites de los módulos o en un destructor.

 2
Author: Tobias Langner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-28 05:49:11

Recomendaría agregar try catch en funciones que hace asignación de memoria, eliminación, llamar a otras funciones complejas, etc. En realidad, en cuanto al rendimiento, try catch agrega un poco de sobrecarga.

Pero teniendo en cuenta el mérito de la captura de las excepciones desconocidas es muy útil. Las buenas prácticas de programación siempre recomiendan agregar algún tipo de manejo de excepciones en su código a menos que sea un programador excepcional.

Me pregunto por qué estás tan preocupado por los pequeños problema de rendimiento que todo el programa está atascado con una excepción.

 1
Author: CodeRider,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-28 05:59:42

Realmente depende del compilador específico.

Si el compilador prefiere considerar el lanzamiento de excepciones como una condición realmente excepcional, entonces puede implementar un esquema en el que, en caso de que no haya excepciones, tiene cero sobrecarga, pero que, a su vez, costará más tiempo en caso de una excepción y/o más tamaño de código.

Para implementar un enfoque de sobrecarga cero, puede notar que en C++ no puede cambiar dinámicamente el código, por lo que una vez que sepa cuál es el marco de la pila y la dirección de retorno, es solucionado cuáles son los objetos que deben ser destruidos en caso de desenrollado o si hay una sección de código de manejo de excepciones. Por lo tanto, el código para lanzar una excepción podría verificar una tabla global de todos los sitios de llamadas a funciones para decidir qué se debe hacer.

Por otro lado, puede hacer que el lanzamiento de excepciones sea más rápido preparando la lista de objetos que se destruirán explícitamente y la dirección del código de manejo de excepciones durante la ejecución normal. Esto hará que el código regular sea más lento, pero manejo de excepciones más rápido y también diría que el código es un poco más pequeño.

Desafortunadamente, no hay una forma estándar en C++ de renunciar por completo al soporte de excepciones, por lo que hay que pagar algo a esta posibilidad: la biblioteca estándar lanza excepciones y cualquier código que llame a código desconocido (por ejemplo, usando un puntero de función o llamando a un método virtual) debe estar preparado para manejar una excepción.

 1
Author: 6502,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-28 06:32:56