¿Cuál es la diferencia entre sjlj vs enano vs seh?

147

No puedo encontrar suficiente información para decidir qué compilador debo usar para compilar mi proyecto. Hay varios programas en diferentes computadoras que simulan un proceso. En Linux, estoy usando GCC. Todo esta bien. Puedo optimizar el código, se compila rápido y usa poca memoria.

Hago mi propio punto de referencia con los compiladores MSVC y GCC. Más tarde, se producen binarios un poco más rápidos (para cada subarquitectura). Aunque el tiempo de compilación es mucho más que MSVC.

Entonces decidí usar MinGW. Pero no puedo encontrar ninguna explicación sobre los métodos de manejo de excepciones y sus implementaciones en MinGW. Puedo usar diferentes distribuciones para diferentes sistemas operativos y arquitecturas.

Consideraciones:

  • El tiempo de compilación y la memoria no son importantes para mi uso. Lo único importante es la optimización del tiempo de ejecución. Necesito que mis programas sean lo suficientemente rápidos. Un compilador lento es aceptable.
  • SO: Microsoft Windows XP / 7/8 / Linux
  • Arquitectura: Intel Core i7 / Core2 / y un i686 muy antiguo con XP: P
sorush-r
fuente
55
Me sorprende que gcc produzca un código más rápido que MSVC; las cosas deben haber cambiado en los últimos años ...
trojanfoe
19
@trojanfoe Me han dicho tantas veces que use MSVC en lugar de MinGW. ¡Todos piensan que msvc es más rápido! Probé MinGW 7.2 y MSVC 2010. con un simple programa cpu-burst. En corei7 con -O3 -mtune=corei7GCC es un 45% más rápido que
MSVC
55
En mi propia experiencia, con un generador de movimientos de ajedrez (que usaba bitboards), tanto MSVC como Intel C ++ eran 10% más rápidos que gcc, pero eso fue hace 2 años ...
trojanfoe
2
@Wolf En ese tiempo, un 45% más rápido significaba un 45% menos de tiempo para ejecutar para mí. Si no recuerdo mal, el tiempo de ejecución de nuestro software de modelado de geometría molecular fue 134s (gcc) y 194s (msvc) para una prueba específica. Sin embargo, ahora considero que mi método de medición es incorrecto e insuficiente (:
sorush-r
2
@ sorush-r Ya veo, calculó (194-134) / 134 que está cerca del 45%, gracias.
Wolf

Respuestas:

109

Hay una breve descripción en MinGW-w64 Wiki :

¿Por qué mingw-w64 gcc no admite Dwarf-2 Exception Handling?

La implementación Dwarf-2 EH para Windows no está diseñada para funcionar en aplicaciones Windows de 64 bits. En el modo win32, el controlador de desenrollado de excepciones no puede propagarse a través de un código no compatible con dw2, esto significa que cualquier excepción que pase por un código de "marcos extraños" no conscientes de dw2 fallará, incluidas las DLL del sistema de Windows y las DLL creadas con Visual Studio. El código de desenrollado enano-2 en gcc inspecciona el ensamblaje de desenrollado x86 y no puede continuar sin otra información de desenrollado enano-2.

El método de manejo de excepciones SetJump LongJump funciona para la mayoría de los casos en win32 y win64, excepto en fallas de protección general. El soporte de manejo de excepciones estructurado en gcc se está desarrollando para superar las debilidades de dw2 y sjlj. En win64, la información de desenrollado se coloca en la sección xdata y existe la .pdata (tabla de descriptores de funciones) en lugar de la pila. Para win32, la cadena de controladores está en la pila y necesita ser guardada / restaurada por código ejecutado real.

GCC GNU sobre manejo de excepciones :

GCC admite dos métodos para el manejo de excepciones (EH):

  • DWARF-2 (DW2) EH , que requiere el uso de información de depuración DWARF-2 (o DWARF-3). DW-2 EH puede hacer que los ejecutables se hinchen un poco porque las tablas de desenrollado de la pila de llamadas grandes deben incluirse en los ejecutables.
  • Un método basado en setjmp / longjmp (SJLJ) . EH basado en SJLJ es mucho más lento que DW2 EH (penalizando incluso la ejecución normal cuando no se lanzan excepciones), pero puede funcionar en código que no se ha compilado con GCC o que no tiene información de desenrollado de la pila de llamadas.

[...]

Manejo de excepciones estructuradas (SEH)

Windows usa su propio mecanismo de manejo de excepciones conocido como Manejo de excepciones estructuradas (SEH). [...] Desafortunadamente, GCC aún no es compatible con SEH. [...]

Ver también:

ollo
fuente
77
Gracias por los enlaces. Voy a usar DW2 para 32 bits y SEH para 64. SEH está disponible en mingwbuilds (4.8). ¿Debo esperar a la versión estable de 4.8 o está bien? Se compila aquí. Actualmente estoy haciendo dependencias de mi proyecto usando 4.8 con SEH. Todavía no hay problemas ...
sorush-r
2
Todas las dependencias (incluidas la biblioteca Boost, OpenSSL, ICU, freeGLUT) se compilaron, pero Qt termina con muchos errores internos del compilador. Creo que esperaré la versión estable de 4.8
sorush-r
¿Usó binarios de qt o compiló usted mismo?
44
@woreos Yo uso mi propia construcción Qt. Descubrí que no había ningún problema con Qt ni GCC 4.8. ¡Era mi RAM medio quemada! 1 Ahora todo funciona bien
sorush-r
82

SJLJ (setjmp / longjmp): - disponible para 32 bits y 64 bits - no "costo cero": incluso si no se lanza una excepción, incurre en una penalización de rendimiento menor (~ 15% en código pesado de excepción) - permite excepciones para atravesar, por ejemplo, las devoluciones de llamada de Windows

DWARF (DW2, dwarf-2): disponible solo para 32 bits, sin sobrecarga de tiempo de ejecución permanente, necesita que la pila de llamadas completa esté habilitada para enanos, lo que significa que no se pueden lanzar excepciones, por ejemplo, archivos DLL del sistema de Windows.

SEH (excepción de gastos generales cero): estará disponible para GCC 4.8 de 64 bits.

fuente: http://qt-project.org/wiki/MinGW-64-bit


fuente
2
Lo sentimos, se agrega el enlace fuente.
2
Gracias por su respuesta;)
sorush-r
14
Así que ahora en 2016 podemos dejar esta pregunta y simplemente siempre usar SEH.
rustyx
66
@RustyX Solo si tu objetivo es x86_64
sohnryang
Entonces, ¿enano para x86?
banguru