180 votes

Quelle est la différence entre sjlj vs nain vs seh ?

Je ne trouve pas assez d'informations pour décider quel compilateur je dois utiliser pour compiler mon projet. Il y a plusieurs programmes sur différents ordinateurs qui simulent un processus. Sur Linux, j'utilise GCC. Tout va bien. Je peux optimiser le code, il compile rapidement et n'utilise pas beaucoup de mémoire.

Je fais mon propre benchmark avec les compilateurs MSVC et GCC. Le dernier produit des binaires légèrement plus rapides (pour chaque sous-architecture). Bien que le temps de compilation soit bien supérieur à celui de MSVC.

J'ai donc décidé d'utiliser MinGW. Mais je ne trouve aucune explication sur les méthodes de gestion des exceptions et leurs implémentations dans MinGW. Je peux utiliser différentes distributions pour différents systèmes d'exploitation et architectures.

Considérations :

  • Le temps de compilation et la mémoire ne sont pas importants pour mon utilisation. La seule chose importante est l'optimisation du temps d'exécution. J'ai besoin que mes programmes soient suffisamment rapides. Un compilateur lent est acceptable.
  • Système d'exploitation : Microsoft Windows XP / 7 / 8 / Linux
  • Architecture : Intel Core i7 / Core2 / et un très vieux i686 sous XP :P

8 votes

Je suis surpris que gcc produise un code plus rapide que MSVC ; les choses ont dû changer ces dernières années...

22 votes

@trojanfoe On m'a dit tellement de fois d'utiliser MSVC au lieu de MinGW. Tout le monde pense que MSVC est plus rapide ! J'ai testé MinGW 7.2 et MSVC 2010. avec un simple programme cpu-burst. Sur corei7 avec -O3 -mtune=corei7 GCC est 45% plus rapide que MSVC

7 votes

Dans ma propre expérience, avec un générateur de coups d'échecs (qui utilisait des bitboards), MSVC et Intel C++ étaient tous deux 10% plus rapides que gcc, mais c'était il y a 2 ans...

129voto

ollo Points 8620

Vous trouverez un bref aperçu à l'adresse suivante Wiki MinGW-w64 :

Pourquoi mingw-w64 gcc ne supporte pas la gestion des exceptions de Dwarf-2 ?

El Nain-2 EH pour Windows n'est pas du tout conçue pour fonctionner sous des applications Windows 64 bits. En mode win32, l'exception d'exception ne peut pas se propager à travers du code non-dw2, ce qui signifie que Cela signifie que toute exception passant par un code de "cadres étrangers" non-dw2 non-dw2, y compris les DLLs du système Windows et les DLLs construites avec Visual Studio. Visual Studio. Le code de débobinage Dwarf-2 dans gcc inspecte l'assemblage x86 et est incapable de procéder sans d'autres informations sur le déroulement de Dwarf-2. informations de déroulement.

El SetJump LongJump méthode de gestion des exceptions fonctionne dans la plupart cas sur win32 et win64, à l'exception des défauts de protection généraux. Le support de la gestion des exceptions structurées dans gcc est en cours de développement pour pour surmonter les faiblesses de dw2 et sjlj. Sur win64, la fonction unwind-information sont placés dans la section xdata et il y a le .pdata (table des descripteurs de fonctions) à la place de la pile. Pour win32, la chaîne de gestionnaires sont sur la pile et doivent être sauvés/restaurés par le code exécuté par le code exécuté.

GCC GNU à propos de Traitement des exceptions :

GCC supporte deux méthodes pour la gestion des exceptions (EH) :

  • NAIN-2 (DW2) EH qui nécessite l'utilisation des informations de débogage DWARF-2 (ou DWARF-3). DW-2 EH peut rendre les exécutables légèrement légèrement gonflés car de grandes tables de déroulement de la pile d'appels doivent être être incluses dans ces exécutables.
  • Une méthode basée sur setjmp/longjmp (SJLJ) . L'EH basée sur SJLJ est beaucoup plus lente que l'EH basée sur DW2 (elle pénalise même l'exécution normale lorsqu'aucune exception n'est levée), mais elle peut fonctionner sur du code qui n'a pas été modifié. exceptions ne sont pas levées), mais peut fonctionner sur du code qui n'a pas été compilé avec GCC ou qui n'a pas d'information sur le déroulement de la pile d'appels. informations.

[...]

Traitement structuré des exceptions (SEH)

Windows utilise son propre mécanisme de traitement des exceptions, appelé "Structured Exception Handling" (SEH). [...] Malheureusement, GCC ne supporte pas encore le SEH. [...]

Voir aussi :

7 votes

Merci pour les liens. Je vais utiliser DW2 pour 32bit et SEH pour 64. SEH est disponible dans mingwbuilds (4.8). Dois-je attendre la version stable de la 4.8 ou c'est bon ? Il compile ici. Je suis actuellement en train de faire les dépendances de mon projet en utilisant 4.8 avec SEH. Pas encore de problèmes...

2 votes

Toutes les dépendances (y compris la bibliothèque Boost, OpenSSL, ICU, freeGLUT) ont été compilées mais Qt se retrouve avec de nombreuses erreurs de compilation internes. Je pense que je vais attendre la version stable de 4.8.

0 votes

Avez-vous utilisé les binaires de qt ou avez-vous compilé par vous-même ?

97voto

SJLJ (setjmp/longjmp) : - disponible pour 32 bits et 64 bits - pas "zéro-cost" : même si une exception n'est pas levée, cela entraîne une légère pénalité de performance (~15% dans le code à fortes exceptions) performance (~15% dans du code à forte teneur en exceptions) - permet aux exceptions de permet aux exceptions de traverser, par exemple, les callbacks Windows

DWARF (DW2, dwarf-2) - disponible uniquement pour 32 bits - pas de surcharge permanente au niveau de l'exécution - nécessite que toute la pile d'appels soit activée par le dwarf, ce qui signifie que les exceptions ne peuvent pas être lancées sur, par exemple, des fichiers de données. ce qui signifie que les exceptions ne peuvent pas être lancées sur les DLL du système Windows, par exemple.

SEH (zero overhead exception) - sera disponible pour GCC 4.8 64-bit.

source : https://wiki.qt.io/MinGW-64-bit

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X