2012-01-10 9 views
6

Duplicar posibles:
Measuring exception handling overhead in C++
Performance when exceptions are not thrown (C++)penalización de tiempo de ejecución de C++ tratar bloques

he escuchado anécdotas que el uso de "probar" bloques en C++ se ralentiza el código durante la ejecución -tiempo incluso si no hay excepciones. He buscado pero no he podido encontrar ninguna explicación o justificación para esto. ¿Alguien sabe si esto es cierto & si es así por qué?

+1

Creo que esto: http://stackoverflow.com/questions/691168/how-much-footprint-does-c-exception-handling-add responderá a su pregunta. –

+1

eche un vistazo a esta pregunta: http://stackoverflow.com/questions/43253/measuring-exception-handling-overhead-in-c – codeling

+3

¤ Consulte el Informe técnico de C++ sobre el rendimiento de C++ (ISO/IEC TR 18015 : Rendimiento C++ 2006 - borrador TR)] (http://www.open-std.org/jtc1/sc22/wg21/docs/TR18015.pdf). Básicamente, depende de la forma en que se implemente el manejo de excepciones, que a su vez depende de suposiciones sobre lo que sucederá con más frecuencia. Cheers & hth., –

Respuesta

17

La respuesta, como siempre, es "depende".

Depende de cómo el compilador implementa el manejo de excepciones.

Si está utilizando MSVC y apunta a Windows de 32 bits, usa un mecanismo basado en pila, que requiere un código de configuración cada vez que ingresa a un bloque de prueba, así que sí, eso significa que incurre en una penalización cada vez que ingrese dicho bloque, incluso si no se lanza ninguna excepción.

Prácticamente cualquier otra plataforma (otros compiladores, así como MSVC con Windows de 64 bits) utilizan un enfoque basado en tablas donde algunas tablas estáticas se generan en tiempo de compilación, y cuando se lanza una excepción, una tabla simple se realiza, y no se debe inyectar ningún código de configuración en los bloques try.

+1

Pero al insertar try/catch se deshabilitarán las optimizaciones (hasta cierto punto) en cualquier compilador de optimización (correcto). –

+0

¿Huh? ¿Qué optimizaciones quiere decir y por qué? – jalf

+1

Lo que quieras - optimizaciones de bucle (si try/catch está en el bucle), eliminación de subexpresiones común, etc.El compilador debe suponer que el código podría saltar desde cualquier punto en el rango de prueba hasta el bloque de captura, por lo que no se puede optimizar muy fácilmente a través del límite del rango de prueba. –

6

Existen dos formas comunes de implementar excepciones.

Uno, a veces denominado "basado en tablas" o "DWARF", utiliza datos estáticos para especificar cómo desenrollar la pila desde cualquier punto dado; esto no tiene sobrecarga de tiempo de ejecución excepto cuando se lanza una excepción.

La otra, a veces denominada "basada en la pila", "setjmp-longjmp" o "sjlj", mantiene los datos dinámicos para especificar cómo desenrollar la pila de llamadas actual. Esto tiene cierta sobrecarga de tiempo de ejecución cada vez que ingresa o sale de un bloque try, y cada vez que crea o destruye un objeto automático con un destructor no trivial.

El primero es más común en los compiladores modernos (sin duda, GCC lo ha hecho de forma predeterminada durante muchos años); deberá verificar la documentación del compilador para ver cuál utiliza y si es configurable.

+0

'DWARF' solo se utiliza para depurar información AFAIK, nunca para desenrollar datos – Hasturkun

+1

@Hasturkun: La información necesaria para desenrollar la pila es la misma (parte de) la información necesaria para la depuración, por lo que al menos GCC y LLVM usan DWARF para ambos, y algunas veces se refieren al manejo basado en tablas como "manejo DWARF". –

Cuestiones relacionadas