2013-03-27 7 views
112

Ich kann nicht genügend Informationen finden, um zu entscheiden, welchen Compiler ich verwenden soll, um mein Projekt zu kompilieren. Es gibt mehrere Programme auf verschiedenen Computern, die einen Prozess simulieren. Unter Linux verwende ich GCC. Alles ist wunderbar. Ich kann Code optimieren, er kompiliert schnell und verwendet nicht so viel Speicher.Was ist der Unterschied zwischen Sjlj vs Zwerg vs seh?

Ich mache meine eigenen Benchmark mit MSVC und GCC-Compiler. Später erzeugt man etwas schnellere Binärdateien (für jede Unterarchitektur). Obwohl Kompilierzeit viel mehr als MSVC ist.

Also entschied ich mich, MinGW zu verwenden. Sie können jedoch keine Erklärungen zu Ausnahmebehandlungsmethoden und ihren Implementierungen in MinGW finden. Ich kann verschiedene Distributionen für verschiedene Betriebssysteme und Architekturen verwenden.

Überlegungen:

  • Compile Zeit und Speicher sind für meine Nutzung nicht wichtig. Wichtig ist nur die Laufzeitoptimierung. Ich brauche meine Programme, um schnell genug zu sein. Ein langsamer Compiler ist akzeptabel.
  • Betriebssystem: Microsoft Windows XP/7/8/Linux
  • Architektur: Intel Core i7/Core 2/und eine sehr alte i686 läuft XP: P
+5

Ich bin überrascht, gcc schnellen Code als MSVC erzeugt; Die Dinge müssen sich in den letzten Jahren verändert haben ... – trojanfoe

+15

@trojanfoe Mir wurde schon so oft gesagt, MSVC statt MinGW zu benutzen. Jeder denkt, msvc ist schneller! Ich habe MinGW 7.2 und MSVC 2010 mit einem einfachen CPU-Burst-Programm getestet. Auf Corei7 mit '-O3 -mtune = corei7' GCC ist 45% schneller als MSVC –

+4

In meiner eigenen Erfahrung, mit einem Schachzug-Generator (der Bitboards verwendete), waren sowohl MSVC als auch Intel C++ 10% schneller als gcc, aber das war Vor 2 Jahren ... – trojanfoe

Antwort

78

Es gibt einen kurzen Überblick auf MinGW-w64 Wiki:

Warum mingw-w64 gcc Unterstützung nicht Dwarf-2 Ausnahmebehandlung?

Die Dwarf-2 EH Implementierung für Windows ist gar nicht zu Arbeit unter 64-Bit-Windows-Anwendungen konzipiert. Im Win32-Modus kann die Ausnahme Abwicklungs-Handler nicht über nicht-dw2-fähigen Code propagieren, dh , dass jede Ausnahme, die durch nicht-dw2-fähige "fremde Frames" -Code passiert, einschließlich Windows-System-DLLs und DLLs mit Visual erstellt fehlschlagen Studio. Der Abwicklungscode von Dwarf-2 in gcc prüft die Abwicklungsbaugruppe x86 und kann nicht ohne weitere Informationen zur Abwicklungsfunktion von dwarf-2 fortfahren.

Die setjump Longjump Methode der Ausnahmebehandlung funktioniert bei den meisten Fällen sowohl win32 und win64, außer für allgemeine Schutzverletzungen. Strukturierte Ausnahmehandhabungsunterstützung in gcc wird entwickelt, um die Schwächen von dw2 und sjlj zu überwinden. Auf win64 wird die Unroll-Information im xdata-Abschnitt abgelegt und es gibt die .pdata (Funktionsdeskriptortabelle) anstelle des Stacks. Für Win32 ist die Kette der Handler auf dem Stapel und muss durch echten ausgeführten Code gesichert/wiederhergestellt werden.

GCC GNU über Ausnahmebehandlung:

GCC zwei Methoden für die Ausnahme unterstützt Handhabung (EH):

  • dwarf-2 (DW2) EH, die erfordert die Verwendung von DWARF-2 (oder DWARF-3) Debugging-Informationen. DW-2 EH kann bewirken, dass ausführbare Dateien leicht aufgebläht sind, da große Abwicklungs-Tabellen für den Aufruf-Stack in den ausführbaren Dateien enthalten sein müssen.
  • Eine Methode basierend auf setjmp/longjmp (SJLJ). SJLJ-based EH ist viel langsamer als DW2 EH (bestraft sogar normale Ausführung, wenn keine Ausnahmen ausgelöst werden), kann aber Code verwenden, der nicht mit GCC kompiliert wurde oder der keine Callstack Unwinding Information aufweist.

[...]

Structured Exception Handling (SEH)

Windows verwendet seine eigene Ausnahmebehandlung als Structured Exception bekannt Handling (SEH). [...] Leider unterstützt GCC SEH noch nicht. [...]

Siehe auch:

+7

Danke für die Links. Ich werde DW2 für 32bit und SEH für 64 verwenden. SEH ist in mingwbuilds (4.8) verfügbar. Sollte ich auf stabile Version 4.8 warten oder es ist ok? Es kompiliert hier. Ich mache gerade Abhängigkeiten von meinem Projekt mit Hilfe von 4.8 mit SEH. Noch keine Probleme ... –

+5

Ich denke du kannst schon 4.8 benutzen. – ollo

+2

Alle Abhängigkeiten (einschließlich Boost-Bibliothek, OpenSSL, ICU, freegUT) kompiliert, aber Qt endet mit vielen internen Compiler-Fehlern. Ich denke, ich werde auf stabile Veröffentlichung von 4.8 warten –

61

SJLJ (setjmp/longjmp) : - verfügbar für 32 Bit und 64 Bit - nicht "Zero-Cost": selbst wenn eine Ausnahme nicht geworfen wird, verursacht es eine geringfügige Performance-Penalty (~ 15% in Ausnahme schweren Code) - ermöglicht Ausnahmen zu durchlaufen durch zB Fenster

ZWERG Rückrufe (DW2, Zwerg-2) - nur für 32-Bit - keine permanente Überkopflaufzeit - braucht Stapel ganzen Aufruf Zwerg aktiviert zu sein, was bedeutet, können Ausnahmen über beispielsweise nicht geworfen werden Windows System DLLs.

SEH (Null Overhead Ausnahme) - wird für 64-Bit GCC 4.8 verfügbar sein.

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

+2

Sorry, der Quelllink wurde hinzugefügt. –

+2

Danke für deine Antwort;) –

+4

So jetzt im Jahr 2016 können wir diese Frage stellen und einfach immer SEH verwenden. – rustyx