Qual'è la differenza tra sjlj vs dwarf vs seh?


147

Non riesco a trovare abbastanza informazioni per decidere quale compilatore dovrei usare per compilare il mio progetto. Esistono diversi programmi su computer diversi che simulano un processo. Su Linux, sto usando GCC. È tutto bellissimo. Sono in grado di ottimizzare il codice, si compila velocemente e usa poca memoria.

Faccio il mio benchmark con i compilatori MSVC e GCC. Successivamente uno produce file binari leggermente più veloci (per ogni sottoarchitettura). Sebbene il tempo di compilazione sia molto più di MSVC.

Quindi ho deciso di utilizzare MinGW. Ma non riesco a trovare alcuna spiegazione sui metodi di gestione delle eccezioni e sulle loro implementazioni in MinGW. Posso usare diverse distribuzioni per diversi sistemi operativi e architetture.

considerazioni:

  • Il tempo di compilazione e la memoria non sono importanti per il mio utilizzo. L'unica cosa importante è l'ottimizzazione del runtime. Ho bisogno che i miei programmi siano abbastanza veloci. Un compilatore lento è accettabile.
  • Sistema operativo: Microsoft Windows XP / 7/8 / Linux
  • Architettura: Intel Core i7 / Core2 / e un i686 molto vecchio con XP: P

5
Sono sorpreso che gcc produca un codice più veloce di MSVC; le cose devono essere cambiate negli ultimi anni ...
trojanfoe,

19
@trojanfoe Mi è stato detto tante volte di usare MSVC invece di MinGW. Tutti pensano che msvc sia più veloce! Ho testato MinGW 7.2 e MSVC 2010. con un semplice programma cpu-burst. Su corei7 con -O3 -mtune=corei7GCC è il 45% più veloce di MSVC
sorush-r

5
Nella mia esperienza, con un generatore di mosse di scacchi (che utilizzava bitboard), sia MSVC che Intel C ++ erano il 10% più veloci di gcc, ma era 2 anni fa ...
trojanfoe

2
@Wolf In quel periodo il 45% più veloce significava il 45% in meno di tempo per eseguire per me. Se ricordo bene, il tempo di esecuzione del nostro software di modellazione della geometria molecolare era 134s (gcc) e 194s (msvc) per un test specifico. Tuttavia ora ritengo che il mio metodo di misurazione sia errato e insufficiente (:
sorush-r

2
@ sorush-r Vedo, hai calcolato (194-134) / 134 che è vicino al 45%, grazie.
Lupo,

Risposte:


109

C'è una breve panoramica nel Wiki di MinGW-w64 :

Perché mingw-w64 gcc non supporta la gestione delle eccezioni di Dwarf-2?

L' implementazione EH di Dwarf-2 per Windows non è progettata per funzionare con le applicazioni Windows a 64 bit. In modalità win32, il gestore di svolgimento di eccezioni non può propagarsi attraverso un codice consapevole non DW2, ciò significa che qualsiasi eccezione che passa attraverso qualsiasi codice "frame straniero" non consapevole DWL fallirà, incluse le DLL di sistema di Windows e le DLL create con Visual Studio. Il codice di svolgimento di Dwarf-2 in gcc controlla l'assemblaggio di svolgimento x86 e non è in grado di procedere senza altre informazioni di svolgimento di nano-2.

Il metodo SetJump LongJump di gestione delle eccezioni funziona nella maggior parte dei casi su win32 e win64, ad eccezione degli errori di protezione generale. Il supporto alla gestione delle eccezioni strutturate in gcc è stato sviluppato per superare le debolezze di dw2 e sjlj. Su win64, le informazioni di svolgimento sono collocate nella sezione xdata e c'è il .pdata (tabella descrittore di funzione) invece dello stack. Per win32, la catena di gestori è nello stack e deve essere salvata / ripristinata dal codice reale eseguito.

GCC GNU sulla gestione delle eccezioni :

GCC supporta due metodi per la gestione delle eccezioni (EH):

  • DWARF-2 (DW2) EH , che richiede l'uso delle informazioni di debug di DWARF-2 (o DWARF-3). DW-2 EH può far gonfiare leggermente gli eseguibili perché nelle tabelle degli eseguibili devono essere incluse tabelle di svolgimento di grandi stack di chiamate.
  • Un metodo basato su setjmp / longjmp (SJLJ) . EH basato su SJLJ è molto più lento di DW2 EH (penalizza anche l'esecuzione normale quando non vengono generate eccezioni), ma può funzionare su codice che non è stato compilato con GCC o che non ha informazioni di svolgimento dello stack di chiamate.

[...]

Gestione delle eccezioni strutturata (SEH)

Windows utilizza il proprio meccanismo di gestione delle eccezioni noto come Structured Exception Handling (SEH). [...] Sfortunatamente, GCC non supporta ancora SEH. [...]

Guarda anche:


7
Grazie per i collegamenti. Userò DW2 per 32 bit e SEH per 64. SEH è disponibile in mingwbuilds (4.8). Devo aspettare il rilascio stabile di 4.8 o va bene? Si compila qui. Attualmente sto dipendendo dal mio progetto usando 4.8 con SEH. Ancora nessun problema ...
sorush-r

2
Tutte le dipendenze (tra cui libreria Boost, OpenSSL, ICU, freeGLUT) compilate ma Qt finiscono con molti errori interni del compilatore. Penso che aspetterò il rilascio stabile di 4.8
sorush-r

Hai usato binari di qt o hai compilato da solo?

4
@woreos Uso la mia build Qt. Ho scoperto che non c'erano problemi né con Qt né con GCC 4.8. Era la mia RAM semi-bruciata! 1 Ora tutto funziona bene
sorush-r

82

SJLJ ( setjmp / longjmp): - disponibile per 32 bit e 64 bit - non "costo zero": anche se non viene generata un'eccezione, comporta una penalità minore per le prestazioni (~ 15% nel codice pesante dell'eccezione) - ammette eccezioni per attraversare, ad esempio, i callback di Windows

NANO (DW2, nano-2) - disponibile per soli 32 bit - non appesantisce runtime permanente - ha bisogno di tutta la pila chiamata ad essere nano-enabled, il che significa che le eccezioni non possono essere gettati sopra ad esempio DLL di sistema di Windows.

SEH (zero spese generali) - sarà disponibile per GCC 4.8 a 64 bit.

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


2
Siamo spiacenti, il link di origine è stato aggiunto.

2
Grazie per la risposta;)
sorush-r

14
Quindi ora nel 2016 possiamo porre questa domanda a riposo e semplicemente usare sempre SEH.
Rustyx,

6
@RustyX Solo se il tuo obiettivo è x86_64
sohnryang

Così nano per x86?
Banguru
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.