Qual é a diferença entre sjlj vs dwarf vs seh?

147

Não consigo encontrar informações suficientes para decidir qual compilador devo usar para compilar meu projeto. Existem vários programas em computadores diferentes, simulando um processo. No Linux, estou usando o GCC. Tudo é bom. Eu posso otimizar o código, ele compila rapidamente e usa pouca memória.

Eu faço meu próprio benchmark com os compiladores MSVC e GCC. Posteriormente, produz binários um pouco mais rápidos (para cada subarquitetura). Embora o tempo de compilação seja muito mais que o MSVC.

Então eu decidi usar o MinGW. Mas não consigo encontrar nenhuma explicação sobre os métodos de tratamento de exceções e suas implementações no MinGW. Eu posso usar diferentes distribuições para diferentes sistemas operacionais e arquiteturas.

Considerações:

  • Tempo de compilação e memória não são importantes para o meu uso. A única coisa importante é a otimização do tempo de execução. Eu preciso que meus programas sejam rápidos o suficiente. Um compilador lento é aceitável.
  • SO: Microsoft Windows XP / 7/8 / Linux
  • Arquitetura: Intel Core i7 / Core2 / e um i686 muito antigo executando o XP: P
sorush-r
fonte
5
Estou surpreso que o gcc produz código mais rápido que o MSVC; as coisas devem ter mudado nos últimos anos ...
trojanfoe
19
@trojanfoe Já me disseram muitas vezes para usar o MSVC em vez do MinGW. Todo mundo acha que o msvc é mais rápido! Testei o MinGW 7.2 e o MSVC 2010. com um programa simples de cpu-burst. No corei7 com -O3 -mtune=corei7GCC é 45% mais rápido que o MSVC
Sorush-r
5
Na minha própria experiência, com um gerador de movimentos de xadrez (que usava placas de bit), o MSVC e o Intel C ++ foram 10% mais rápidos que o gcc, mas isso foi há 2 anos ...
trojanfoe
2
@Wolf Naquele tempo, 45% mais rápido significava 45% menos tempo para executar para mim. Se bem me lembro, o tempo de execução do nosso software de modelagem de geometria molecular foi de 134s (gcc) e 194s (msvc) para um teste específico. No entanto, agora considero meu método de medição incorreto e insuficiente (:
sorush-r
2
@ sorush-r eu vejo, você calculou (194-134) / 134, que é quase 45%, obrigado.
Wolf

Respostas:

109

Há uma breve visão geral no MinGW-w64 Wiki :

Por que o mingw-w64 gcc não suporta Dwarf-2 Exception Handling?

O Dwarf-2 EH implementação para Windows não foi projetada para funcionar em aplicativos Windows de 64 bits. No modo win32, o manipulador de desenrolamento de exceção não pode se propagar por código que não reconhece dw2, isso significa que qualquer exceção que estiver passando por qualquer código de "quadros externos" que não reconhece dw2 falhará, incluindo DLLs e DLLs do sistema Windows criadas com o Visual Studio. O código de desenrolamento do anão-2 no gcc inspeciona o conjunto de desenrolamento x86 e não pode continuar sem outras informações de desenrolamento do anão-2.

O método SetJump LongJump de tratamento de exceções funciona na maioria dos casos, tanto no win32 quanto no win64, exceto por falhas de proteção geral. O suporte estruturado para manipulação de exceções no gcc está sendo desenvolvido para superar os pontos fracos do dw2 e sjlj. No win64, as informações de desenrolamento são colocadas na seção xdata e há o .pdata (tabela do descritor de funções) em vez da pilha. Para o win32, a cadeia de manipuladores está na pilha e precisa ser salva / restaurada pelo código executado real.

GCC GNU sobre tratamento de exceções :

O GCC suporta dois métodos para tratamento de exceções (EH):

  • DWARF-2 (DW2) EH , que requer o uso de informações de depuração DWARF-2 (ou DWARF-3). O DW-2 EH pode fazer com que os executáveis ​​fiquem levemente inchados, porque as tabelas de desenrolamento de pilha de chamadas grandes precisam ser incluídas nos executáveis.
  • Um método baseado em setjmp / longjmp (SJLJ) . O EH baseado em SJLJ é muito mais lento que o DW2 EH (penalizando até a execução normal quando nenhuma exceção é lançada), mas pode funcionar com códigos que não foram compilados com o GCC ou que não possuem informações de desenrolamento da pilha de chamadas.

[...]

Manipulação de Exceções Estruturadas (SEH)

O Windows usa seu próprio mecanismo de manipulação de exceções, conhecido como SEH (Structured Exception Handling). [...] Infelizmente, o GCC ainda não suporta SEH. [...]

Veja também:

ollo
fonte
7
Obrigado pelos links. Vou usar o DW2 para 32 bits e o SEH para 64. O SEH está disponível no mingwbuilds (4.8). Devo esperar pela liberação estável de 4.8 ou está tudo bem? Compila aqui. Atualmente, estou fazendo dependências do meu projeto usando o 4.8 com SEH. Ainda não há problemas ...
Sorush-r
2
Todas as dependências (incluindo biblioteca Boost, OpenSSL, ICU, freeGLUT) compiladas, mas o Qt acaba com muitos erros internos do compilador. Eu acho que vou esperar pelo lançamento estável do 4.8
sorush-r
Você usou binários de qt ou compilou por conta própria?
4
@woreos Eu uso minha própria compilação Qt. Descobri que não havia nenhum problema com o Qt nem com o GCC 4.8. Era a minha RAM meio queimada! 1 Agora tudo funciona bem
sorush-r
82

SJLJ (setjmp / longjmp): - disponível para 32 bits e 64 bits - não "custo zero": mesmo que uma exceção não seja lançada, ela incorre em uma penalidade de desempenho menor (~ 15% no código pesado da exceção) - permite exceções percorrer, por exemplo, retornos de chamada do Windows

O DWARF (DW2, dwarf-2) - disponível apenas para 32 bits - sem sobrecarga de tempo de execução permanente - precisa que a pilha de chamadas inteira seja ativada para anão, o que significa que exceções não podem ser lançadas sobre, por exemplo, DLLs do sistema Windows.

SEH (exceção de zero overhead) - estará disponível para o GCC 4.8 de 64 bits.

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


fonte
2
Desculpe, o link da fonte foi adicionado.
2
Obrigado pela sua resposta;)
sorush-r
14
Então, agora em 2016, podemos colocar essa questão em pausa e simplesmente sempre usar o SEH.
rustyx
6
@RustyX Só se seu alvo é x86_64
sohnryang
Então anão para x86?
banguru