Яка різниця між sjlj vs dwarf vs seh?


147

Я не можу знайти достатньо інформації, щоб вирішити, який компілятор слід використовувати для складання свого проекту. На різних комп’ютерах є кілька програм, що імітують процес. У Linux я використовую GCC. Все чудово. Я можу оптимізувати код, він швидко збирається та використовує не дуже багато пам'яті.

Я роблю власний тест із компіляторами MSVC та GCC. Пізніше виробляються дещо швидші бінарні файли (для кожної субархітектури). Хоча час компіляції набагато більше, ніж MSVC.

Тому я вирішив використовувати MinGW. Але в MinGW не можна знайти жодного пояснення щодо методів обробки винятків та їх реалізації. Я можу використовувати різні дистрибутиви для різних операційних систем та архітектури.

Міркування:

  • Час компіляції та пам’ять не важливі для мого використання. Важливо лише оптимізація виконання. Мені потрібні, щоб мої програми були досить швидкими. Прийнятний повільний компілятор.
  • ОС: Microsoft Windows XP / 7/8 / Linux
  • Архітектура: Intel Core i7 / Core2 / та дуже старий i686 під керуванням XP: P

5
Я здивований, що GCC виробляє швидший код, ніж MSVC; речі, мабуть, змінилися за останні кілька років ...
trojanfoe

19
@trojanfoe Мені вже так багато разів казали використовувати MSVC замість MinGW. Всі думають, що msvc швидше! Я протестував MinGW 7.2 та MSVC 2010. за допомогою простої програми на процесорі. На corei7 з -O3 -mtune=corei7GCC на 45% швидше, ніж MSVC
sorush-r

5
З мого власного досвіду, з генератором шахових переміщень (в якому використовувались бітборди) і MSVC, і Intel C ++ були на 10% швидше, ніж gcc, але це було 2 роки тому ...
trojanfoe

2
@Wolf У той час 45% швидше означало на 45% менше часу для виконання. Якщо я добре пам'ятаю, час виконання нашого програмного забезпечення для моделювання молекулярної геометрії склав 134s (gcc) та 194s (msvc) для конкретного тесту. Тим не менше зараз я вважаю свій метод вимірювання неправильним і недостатнім (:
sorush-r

2
@ sorush-r Я бачу, ви порахували (194-134) / 134, що становить близько 45%, дякую.
Вовк

Відповіді:


109

Короткий огляд у MinGW-w64 Wiki :

Чому mingw-w64 gcc не підтримує обробку винятків Dwarf-2?

Гном-2 ЄП для Windows зовсім не розроблена для роботи під 64-бітними програмами Windows. У режимі win32 обробник вимкнення винятків не може розповсюджуватися через код, не знаючий dw2, це означає, що будь-який виняток, що проходить через будь-який код, який не знає dw2, "невідомий кадр", не вдасться, включаючи DLL-системи системи Windows та DLL, створені за допомогою Visual Studio. Код розмотування гнома-2 в gcc перевіряє розмотувальну збірку x86 і не може продовжуватися без іншої інформації про розмотування dwarf-2.

Метод SetJump LongJump для обробки винятків працює в більшості випадків як win32, так і win64, за винятком помилок загального захисту. Структурована підтримка обробки винятків у gcc розробляється для подолання слабких сторін dw2 та sjlj. У програмі win64 інформація про розмотування розміщується у розділі xdata, а замість стека є .pdata (таблиця дескрипторів функцій). Для win32 ланцюжок обробників знаходиться в стеці і їх потрібно зберегти / відновити за допомогою реально виконаного коду.

GCC GNU про поводження з винятками :

GCC підтримує два методи обробки винятків (EH):

  • DWARF-2 (DW2) EH , який вимагає використання інформації про налагодження DWARF-2 (або DWARF-3). DW-2 EH може спричинити злегка роздуття виконуваних файлів, оскільки великі таблиці розмотування стека викликів повинні бути включені до цього виконуваного файлу.
  • Метод, заснований на setjmp / longjmp (SJLJ) . EH на базі SJLJ набагато повільніше, ніж DW2 EH (карає навіть нормальне виконання, коли не викидаються винятки), але може працювати через код, який не був складений з GCC або не має інформації, що розгортає стек викликів.

[...]

Структурована обробка виключень (SEH)

Windows використовує власний механізм обробки винятків, відомий як Структурована обробка виключень (SEH). [...] На жаль, GCC ще не підтримує SEH. [...]

Дивитися також:


7
Дякуємо за посилання. Я буду використовувати DW2 для 32-бітових і SEH для 64. SEH доступний у mingwbuilds (4.8). Чи варто чекати стабільного випуску 4,8 чи це нормально? Він складається тут. Наразі я роблю залежності від свого проекту, використовуючи 4.8 із SEH. Проблем поки немає ...
sorush-r

2
Усі залежності (включаючи бібліотеку Boost, OpenSSL, ICU, freeGLUT) складені, але Qt закінчується безліччю внутрішніх помилок компілятора. Я думаю, чекатиму стабільного виходу 4,8
sorush-r

Чи використовували ви двійкові файли qt чи склали власні?

4
@woreos Я використовую власну збірку Qt. Я виявив, що не було жодної проблеми ні з Qt, ні з GCC 4.8. Це була моя напівзгоріла ОЗУ! 1 Зараз все працює добре
sorush-r

82

SJLJ (setjmp / longjmp): - доступний для 32-бітових та 64-бітних - не «нульових витрат»: навіть якщо виняток не кидається, він нараховує незначне покарання за ефективність (~ 15% за винятком важкого коду) - допускає винятки наприклад, для зворотного виклику Windows

DWARF (DW2, dwarf-2) - доступний лише для 32 біт - без постійних накладних режимів виконання - потрібен весь стек викликів, щоб він був увімкнутим карликом, що означає, що винятки не можна переносити, наприклад, на системні DLL-системи Windows.

SEH (нульовий накладний виняток) - буде доступний для 64-розрядних GCC 4.8.

джерело: http://qt-project.org/wiki/MinGW-64-bit


2
На жаль, додано посилання на джерело.

2
Дякую за вашу відповідь;)
sorush-r

14
Тож тепер у 2016 році ми можемо поставити це питання для відпочинку та просто завжди використовувати SEH.
іржа

6
@RustyX Тільки якщо ваша ціль x86_64
sohnryang

Тож Гном для x86?
banguru
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.