2013-03-27 8 views
112

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

मैं एमएसवीसी और जीसीसी कंपाइलर्स के साथ अपना खुद का बेंचमार्क करता हूं। बाद में एक तेजी से तेज द्विआधारी पैदा करता है (प्रत्येक subarchitecture के लिए)। हालांकि संकलन समय एमएसवीसी से कहीं अधिक है।

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

बातें:

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

मैं हैरान जीसीसी MSVC की तुलना में तेजी कोड का उत्पादन कर रहा हूँ; चीजें पिछले कुछ वर्षों में बदलनी चाहिए ... – trojanfoe

+15

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

+4

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

उत्तर

78

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

क्यों Mingw-W64 नहीं है जीसीसी समर्थन बौना -2 एक्सेप्शन हैंडलिंग?

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

अपवाद संचालन के SetJump LongJump विधि, दोनों Win32 और win64 पर सबसे मामलों के लिए काम करता है सामान्य संरक्षण दोष के लिए छोड़कर। जीसीसी में संरचित अपवाद हैंडलिंग समर्थन को विकसित किया जा रहा है dw2 और sjlj की कमजोरियों को दूर करें। Win64 पर, अवांछित जानकारी xdata-section में रखी गई है और स्टैक के बजाय .pdata (फ़ंक्शन डिस्क्रिप्टर टेबल) है। Win32 के लिए, हैंडलर की चेन स्टैक पर हैं और वास्तविक निष्पादित कोड द्वारा सहेजा/बहाल करने की आवश्यकता है।

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

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

  • बौना -2 (DW2) एह, उपयोग की आवश्यकता है जो डीडब्ल्यूएआरएफ -2 (या डीडब्ल्यूएआरएफ -3) डीबगिंग जानकारी। डीडब्ल्यू -2 ईएच निष्पादन योग्य थोड़ा फूला हुआ हो सकता है क्योंकि बड़ी कॉल स्टैक अनदेखी तालिकाओं को वें निष्पादन योग्य में शामिल किया जाना चाहिए।
  • setjmp/longjmp (SJLJ) पर आधारित एक विधि। एसजेएलजे-आधारित ईएच डीडब्लू 2 ईएच की तुलना में बहुत धीमी है ( अपवादों को फेंकने पर भी सामान्य निष्पादन को दंडित करता है), लेकिन जीसीसी के साथ संकलित कोड में काम कर सकता है या उसमें कॉल-स्टैक जानकारी को अनदेखा नहीं करता है।

[...]

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

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

यह भी देखें:

+7

लिंक के लिए धन्यवाद है। मैं 32 बिट के लिए डीडब्ल्यू 2 और 64 के लिए एसईएच का उपयोग करने जा रहा हूं। एसईएच मिंगविबिल्ड (4.8) में उपलब्ध है। क्या मुझे 4.8 की स्थिर रिलीज की प्रतीक्षा करनी चाहिए या यह ठीक है? यह यहाँ संकलित करता है। मैं वर्तमान में एसईएच के साथ 4.8 का उपयोग कर अपने प्रोजेक्ट की निर्भरता बना रहा हूं। अभी तक कोई समस्या नहीं है ... –

+5

मुझे लगता है कि आप पहले ही 4.8 का उपयोग कर सकते हैं। – ollo

+2

सभी निर्भरताओं (बूस्ट लाइब्रेरी, ओपनएसएसएल, आईसीयू, फ्रीजीएलयूटी सहित) संकलित लेकिन क्यूटी कई आंतरिक कंपाइलर त्रुटियों के साथ समाप्त होता है। मुझे लगता है कि मैं 4.8 –

61

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

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

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

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

+2

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

+2

धन्यवाद आपके उत्तर के लिए;) –

+4

तो अब 2016 में हम इस प्रश्न को आराम से रख सकते हैं और बस हमेशा एसईएच का उपयोग कर सकते हैं। – rustyx

संबंधित मुद्दे