Sjlj vs dwarf vs seh में क्या अंतर है?


147

मुझे यह तय करने के लिए पर्याप्त जानकारी नहीं मिल रही है कि मुझे अपने प्रोजेक्ट को संकलित करने के लिए किस संकलक का उपयोग करना चाहिए। एक प्रक्रिया का अनुकरण करने वाले विभिन्न कंप्यूटरों पर कई कार्यक्रम हैं। लिनक्स पर, मैं जीसीसी का उपयोग कर रहा हूं। प्रत्येक वस्तु उत्तम हैं। मैं कोड को ऑप्टिमाइज़ कर सकता हूं, यह तेजी से संकलित करता है और मेमोरी नहीं का उपयोग करता है।

मैं MSVC और GCC कंपाइलर के साथ अपना स्वयं का बेंचमार्क करता हूं। बाद में एक थोड़ा तेजी से बायनेरिज़ पैदा करता है (प्रत्येक उपठेका के लिए)। हालांकि संकलन का समय MSVC से बहुत अधिक है।

इसलिए मैंने MinGW का उपयोग करने का निर्णय लिया। लेकिन MinGW में अपवाद से निपटने के तरीकों और उनके कार्यान्वयन के बारे में कोई स्पष्टीकरण नहीं मिल सकता है। मैं विभिन्न ऑपरेटिंग सिस्टम और आर्किटेक्चर के लिए अलग-अलग वितरण का उपयोग कर सकता हूं।

बातें:

  • मेरे उपयोग के लिए संकलन समय और स्मृति महत्वपूर्ण नहीं है। केवल महत्वपूर्ण चीज रनटाइम ऑप्टिमाइज़ेशन है। मुझे अपने कार्यक्रमों की जरूरत है ताकि मैं काफी तेजी से आगे बढ़ूं। एक धीमी संकलक स्वीकार्य है।
  • ओएस: माइक्रोसॉफ्ट विंडोज एक्सपी / 7/8 / लिनक्स
  • आर्किटेक्चर: Intel Core i7 / Core2 / और एक बहुत पुराना i686 रनिंग XP: P

5
मुझे आश्चर्य है कि MSVC की तुलना में gcc तेज कोड का उत्पादन करता है; पिछले कुछ वर्षों में चीजें बदल गई हैं ...
ट्रोजनफॉ

19
@trojanfoe मुझे मिनगवे के बजाय MSVC का उपयोग करने के लिए कई बार कहा गया है। हर कोई सोचता है कि msvc तेज है! मैंने MinGW 7.2 और MSVC 2010 का परीक्षण किया। एक साधारण सीपीयू-फट प्रोग्राम के साथ। -O3 -mtune=corei7जीसीसी के साथ
Corei7 पर

5
मेरे अपने अनुभव में, एक शतरंज चाल जनरेटर (जिसमें बिटबोर्ड का उपयोग किया गया था) के साथ, MSVC और Intel C ++ दोनों gcc की तुलना में 10% तेज थे, लेकिन यह 2 साल पहले था ...
trojanfoe

2
@Wolf उस समय 45% तेजी का मतलब मेरे लिए निष्पादित करने के लिए 45% कम समय था। अगर मुझे सही याद है, तो हमारे आणविक ज्यामिति मॉडलिंग सॉफ्टवेयर का निष्पादन समय एक विशिष्ट परीक्षण के लिए 134s (gcc) और 194s (msvc) था। : फिर भी अब मैं होने के लिए गलत और अपर्याप्त (माप की मेरी विधि पर विचार
Sorush-r

2
@ sorush-r मैं देख रहा हूं, आपने गणना की (194-134) / 134 जो 45% के पास है, धन्यवाद।
वुल्फ

जवाबों:


109

MinGW-w64 Wiki पर एक संक्षिप्त अवलोकन है :

डिंगफ़ -2 एक्सेप्शन हैंडलिंग का समर्थन क्यों नहीं करता है?

बौना -2 एह विंडोज के लिए कार्यान्वयन 64-बिट Windows अनुप्रयोगों के तहत काम करने के लिए बिल्कुल भी नहीं बनाया गया है। Win32 मोड में, अपवाद वाले हैंडलर को गैर-dw2 जागरूक कोड के माध्यम से प्रचारित नहीं किया जा सकता है, इसका मतलब यह है कि किसी भी गैर-dw2 "विदेशी फ्रेम" कोड के माध्यम से जाने वाला कोई भी अपवाद विफल हो जाएगा, जिसमें विजुअल स्टूडियो द्वारा निर्मित विंडोज सिस्टम DLL और DLL शामिल हैं। Dccf-2 कोडिंग इन gcc का निरीक्षण x86 अनइंडिंग असेंबली का निरीक्षण करता है और अन्य बौने -2 सात सूचनाओं के बिना आगे बढ़ने में असमर्थ है।

सामान्य सुरक्षा दोषों को छोड़कर, Win32 और win64 दोनों पर अधिकांश मामलों के लिए अपवाद हैंडलिंग का SetJump LongJump तरीका काम करता है। Dw2 और sjlj की कमजोरियों को दूर करने के लिए gcc में संरचित अपवाद हैंडलिंग हैंडल विकसित किया जा रहा है। जीतने पर, एक्सिडेंट-इनफॉर्मेशन को एक्सडाटा-सेक्शन में रखा जाता है और स्टैक के बजाय .ddata (फंक्शन डिस्क्रिप्टर टेबल) होता है। Win32 के लिए, हैंडलर की श्रृंखला स्टैक पर है और वास्तविक निष्पादित कोड द्वारा सहेजे / बहाल किए जाने की आवश्यकता है।

अपवाद हैंडलिंग के बारे में GCC GNU :

GCC अपवाद से निपटने के लिए दो तरीकों का समर्थन करता है (EH):

  • DWARF-2 (DW2) EH , जिसके लिए DWARF-2 (या DWARF-3) का उपयोग करने की जानकारी प्राप्त करने की आवश्यकता होती है। DW-2 EH निष्पादक को थोड़ा फूला हुआ होने का कारण बन सकता है क्योंकि बड़े कॉल स्टैक अनइंडिंग टेबल को वें निष्पादक में शामिल करना होता है।
  • सेटजम्प / लॉन्गजम्प (एसजेएलजे) पर आधारित एक विधि । SJLJ आधारित EH DW2 EH की तुलना में बहुत धीमा है (कोई अपवाद नहीं होने पर भी सामान्य निष्पादन को दंडित करता है), लेकिन ऐसे कोड में काम कर सकता है जिसे GCC के साथ संकलित नहीं किया गया है या जिसके पास कॉल-स्टैक अनइंडिंग जानकारी नहीं है।

[...]

संरचित अपवाद हैंडलिंग (SEH)

विंडोज अपने स्वयं के अपवाद हैंडलिंग तंत्र का उपयोग करता है जिसे संरचित अपवाद हैंडलिंग (SEH) के रूप में जाना जाता है। [...] दुर्भाग्य से, GCC अभी तक SEH का समर्थन नहीं करता है। [...]

यह सभी देखें:


7
लिंक के लिए धन्यवाद। मैं 322 के लिए DW2 और 64 के लिए SEH का उपयोग करने जा रहा हूं। SEH मिंगव्यूड्स (4.8) में उपलब्ध है। क्या मुझे 4.8 के स्थिर रिलीज का इंतजार करना चाहिए या यह ठीक है? यह यहाँ संकलित है। मैं वर्तमान में SEH के साथ 4.8 का उपयोग करके अपनी परियोजना की निर्भरता बना रहा हूं। अभी तक कोई समस्या नहीं ...
sorush-r

2
सभी निर्भरताएं (बूस्ट लाइब्रेरी, ओपनएसएसएल, आईसीयू, फ्रीग्लूट सहित) संकलित की गई हैं, लेकिन क्यूटी अंत में बहुत सारे आंतरिक संकलक त्रुटियों के साथ है। मुझे लगता है कि मैं
२१.३५ पर ४. sor

क्या आपने qt के बायनेरिज़ का उपयोग किया था या आपने खुद से संकलन किया था?

4
@woreos मैं अपने खुद के क्यूटी निर्माण का उपयोग करता हूं। मैंने पाया कि न तो क्यूटी और न ही जीसीसी 4.8 के साथ कोई समस्या थी। यह मेरी आधी जली हुई रैम थी! 1 अब सब कुछ ठीक काम करता है
शर्बत-आर

82

SJLJ ( सेटजम्प / लॉन्गजम्प): - 32 बिट और 64 बिट के लिए उपलब्ध - "शून्य-लागत" नहीं: भले ही कोई अपवाद नहीं फेंका गया हो, यह एक मामूली प्रदर्शन दंड देता है (अपवाद भारी कोड में 15%) - अपवादों की अनुमति देता है उदाहरण के लिए विंडोज़ कॉलबैक के माध्यम से पार जाना

DWARF (DW2, dwarf-2) - केवल 32 बिट के लिए उपलब्ध है - कोई स्थायी रनवे ओवरहेड - बौना-सक्षम होने के लिए पूरे कॉल स्टैक की आवश्यकता नहीं है, जिसका अर्थ है कि अपवाद को विंडोज सिस्टम DLL पर नहीं फेंका जा सकता है।

एसईएच (शून्य ओवरहेड अपवाद) - 64-बिट जीसीसी 4.8 के लिए उपलब्ध होगा।

स्रोत: http://qt-project.org/wiki/MinGW-64-bit


2
क्षमा करें, स्रोत लिंक जोड़ा जाता है।

2
आपके उत्तर के लिए धन्यवाद;)
सोरुष-आर

14
तो अब 2016 में हम इस प्रश्न को आराम करने के लिए रख सकते हैं और बस हमेशा सेह का उपयोग कर सकते हैं।
रस्टीक्स

6
@RustyX केवल अगर आपका लक्ष्य x86_64 है
sohnryang

तो x86 के लिए बौना?
बैंगुरु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.