2009-05-30 21 views
21

मैं विंडोज़ पर जीसीसी/मिनजीडब्ल्यू के साथ कोड :: ब्लॉक आईडीई का उपयोग कर रहा हूं, और मैं एक wxwidgets एप्लिकेशन बनाने की कोशिश कर रहा हूं जिसमें सीए है। 20k लाइनें और 40 स्रोत मॉड्यूल। और यह बहुत धीमा बनाता है।मिनजीडब्ल्यू क्यों धीमा है?

एक सी ++ मॉड्यूल संकलन 2-5 सेकंड तक रहता है, और लिंकिंग 2-3 मिनट तक चलती है।

यह एक पोर्टेबल कोड है, और यह कोड लिनक्स पर बहुत तेज़ संकलित करता है। मैं बिल्ड संदेश विंडो का पालन नहीं कर सकता ... पूरी प्रक्रिया 20 सेकंड से कम तक चलती है।

मैंने सामान्य tweaks (उदाहरण के लिए, precompiled शीर्षलेख, अनुकूलन बंद करें, आदि) की कोशिश की, लेकिन कुछ भी काम नहीं किया।

यह इतना धीमा क्यों है?

+0

आप किस जीसीसी संस्करण का उपयोग कर रहे हैं? –

+0

पता लगाने के लिए कमांड लाइन पर gcc --version करें gcc संस्करण v3.4.5 – Calmarius

उत्तर

13

क्या आप एक सक्रिय निर्देशिका डोमेन पर हैं, लेकिन तुरंत उससे जुड़े नहीं हैं?

जबकि मेरे पास "उत्तर" नहीं है कि क्यों MinGW धीमा हो जाएगा, यह मेरा अनुभव रहा है कि कंप्यूटर जो एडी डोमेन से संबंधित हैं, लेकिन एडी नियंत्रक तक पहुंचने में असमर्थ हैं, शुरुआत में देरी हो रही है निष्पादन योग्य (जैसे rxvt.exe) और वर्तमान में चल रहे लोगों को रोकें या स्टटर का अनुभव करें (जैसे एमएक्स, जो मिनीजीडब्लू का उपयोग करके बनाया गया है)।

मैं अभी भी इस व्यवहार के वास्तविक का निर्धारण करने की जांच कर रहा हूं, लेकिन सोचा कि अगर यह आपके लिए लागू होता है तो मैं इसका उल्लेख करता हूं।

+5

+1 है, मैं इसे भी अनुभव कर रहा हूं, मेरे नेटवर्क एडेप्टर परिणामों को तुरंत स्टार्टअप में अक्षम कर रहा हूं। मेरी मेजबान फ़ाइल में डोमेन नियंत्रकों के लिए फर्जी DNS प्रविष्टियां (127.0.0.1) डालने से चीजें _much_ quicker बनाती हैं, लेकिन नेटवर्क को पूरी तरह अक्षम करने जितनी जल्दी नहीं होती है। –

+0

हमारा एडी नियंत्रक यहां है: server.domain.com। मेरी मेजबान फ़ाइल में "127.0.0.1 server.domain.com" जोड़ना चाल है। – rcmadruga

+0

इस संकेत के लिए धन्यवाद। मैं उम्र के लिए सोच रहा हूं क्यों यह केवल मेरी मशीनों में से एक पर होता है! ऐसा इसलिए होता है कि यह अपने एडी डोमेन से जुड़ा नहीं है ... –

0

आप टूलसेट के एक और हालिया संस्करण का उपयोग करने का प्रयास कर सकते हैं। मैंने यह उपयोगी पाया: http://nuwen.net/mingw.html इसमें एक ही बड़े पैकेज में मिनजीडब्ल्यू और सामान्य एपीआई द्वारा उपयोग किए जाने वाले सभी टूल्स हैं। साइट से:

मेरे MinGW वितरण ("वितरण") 64-निवासी है और वर्तमान में जीसीसी 6.1.0 और 1.61.0 बूस्ट होता है।

मिनजीडब्ल्यू विंडोज़ के लिए जीसीसी का एक बंदरगाह है। यह उपयोग करने के लिए नि: शुल्क और सरल है (अच्छी तरह से, टूलचेन के रूप में सरल के रूप में सरल)। यह स्टैंडअलोन विंडोज एक्जिक्यूटिव का उत्पादन करता है जिसे किसी भी तरीके से वितरित किया जा सकता है।

6

मिनजीडब्ल्यू पर कई "यूनिक्स" चीजें दर्दनाक धीमी हैं, क्योंकि विंडोज़ में fork() नहीं है। विंडोज़ में केवल CreateProcess() है, जो काफी अलग है। यूनिक्स शैल और जीएनयू बहुत सारे फोर्किंग करें, इसलिए इन्हें मिन्यूडब्ल्यू परिणामों के तहत "नकली" फोर्क्स में चलाएं, जो वास्तव में धीमी हैं।

एक और चीज जो इससे ग्रस्त है वह जीएनयू ऑटोोटूल है, इसलिए ./configure स्क्रिप्ट्स चलाना स्रोतों से "यूनिक्स" अनुप्रयोगों को बनाने में बहुत धीमी है। यदि आपको इसे कई बार करने की आवश्यकता है तो यह वास्तव में परेशान हो सकता है (उदाहरण के लिए जब प्राप्त करने में परेशानी हो रही है तो सभी पुस्तकालयों को खोजने के लिए कॉन्फ़िगर करें)।

This answer कैसे Cygwin और MinGW इस्तेमाल किया अनुकरण fork() और अधिक विस्तार से बताते हैं, और this answer तारीख स्पष्टीकरण अप करने के लिए अधिक है।

+1

क्या आप हमें यह बताने की कोशिश कर रहे हैं कि फोर्क() वास्तव में execp() के बाद वर्तमान प्रक्रिया को क्लोन करने के लिए उपयोग किया जाता है? कौन सा कंपाइलर/लिंकर को प्रक्रिया को क्लोन करने की आवश्यकता है? –

+1

@ExcessPhase मुझे यकीन नहीं है कि इसका मतलब क्या है। यूनिक्स प्रोग्राम बाल प्रक्रियाओं को बनाने के लिए 'कांटा() 'का उपयोग करते हैं। जब आप MinGW के लिए यूनिक्स प्रोग्राम को संकलित करते हैं, तो 'फोर्क()' कॉल * अभी भी * को "असली" यूनिक्स की तरह ही एक बाल प्रक्रिया बनाने की आवश्यकता होती है, भले ही 'फोर्क() 'के बाद * exec *, no इससे कोई फर्क नहीं पड़ता कि MinGW नकली कांटा कितना धीमा है, क्योंकि संकलक प्रोग्राम कोड को विंडोज के तहत अधिक कुशलतापूर्वक काम करने के लिए नहीं बदल सकता है। – hyde

+0

@ExcessPhase हालांकि, चीजें अनुकूलित हो सकती हैं, मैंने अभी एक दूसरा उत्तर लिंक जोड़ा है। – hyde

1

MSYS 1.0.19-1 के रूप में, यदि उपयोगकर्ता खाते सक्रिय निर्देशिका डोमेन में है और डोमेन नियंत्रक (डीसी) पहुंच से बाहर है, तो MSYS DLL एक लंबी देरी के किसी भी MSYS निष्पादन शुरू करने से पहले (कि MSYS DLL उपयोग करता है) का परिचय देंगे।यह MSYS make और CoreUtils पैकेज जैसे ls, rm आदि से सभी कमांड-लाइन उपयोगिताओं को प्रभावित करता है जो आम तौर पर C:\MinGW\msys\1.0\bin में स्थापित होते हैं।

टिप्पणियों:

  • जब MSYS bash खोल से उपयोगिताओं शुरू करने, केवल खोल के स्टार्टअप देरी ने टक्कर मार दी है। खोल से लॉन्च की गई यूटिलिटीज पर असर नहीं पड़ता है।

  • देरी भिन्न हो सकती है, मेरे मामले में यह 21sec है।

  • देरी कमांड बिना किसी नई देरी के लॉन्च होने के बाद 10-20sec के भीतर किसी भी एमएसवाईएस उपयोगिता को चला रहा है।
  • समस्या तब होती है जब मशीन किसी अन्य नेटवर्क से कनेक्ट होती है, या जब उसके डोमेन से डिस्कनेक्ट हो जाती है, या जब डोमेन नियंत्रक होस्टनाम बदलता है (मेरे मामले में समस्या)। यह जांचने के लिए कि क्या डीसी पहुंच योग्य है, cmd खोलें और echo %LOGONSERVER% टाइप करें, फिर ping या net view डीसी के होस्ट नाम के साथ टाइप करें।

ऐसा क्यों है इतनी धीमी गति से है:

  • uinfo.cc internal_getlogin() में MSYS DLL का कोड दो प्रणाली उपयोगकर्ता जानकारी प्राप्त करने के लिए कॉल करता है। स्थानीय मशीन से उपयोगकर्ता खाते को पुनः प्राप्त करने के लिए पहली बार यह NetUserGetInfo() पर कॉल करता है। यह डोमेन उपयोगकर्ताओं के लिए विफल रहता है, इसलिए यह दूसरी बार डीसी सर्वर के साथ LOGONSERVER चर से लिया जाता है। यदि यह होस्ट तुरंत पहुंच योग्य नहीं है, तो कॉल टाइमआउट पर विफल होने तक यह एक लंबी देरी पेश करेगा। आवेदन शीघ्र ही बाद में शुरू होगा।

कैसे इस समस्या से बचने के लिए, कई संभावित हल:

  • या तो MSYS खोल से सब कुछ चलाते हैं, या
  • तो कारण डीसी होस्टनाम में परिवर्तन, तो पुन: प्रारंभ करने या पुन: प्रवेश करेगा मामले को हल करो। विंडोज स्वचालित डीसी होस्ट के साथ LOGONSERVER स्वचालित रूप से अपडेट हो जाएगा।
  • यदि MSYS उपकरण विंडोज cmd या एक स्क्रिप्ट से बुलाए जाते हैं, तो नेटवर्क एक्सेस से बचने के लिए 0hको स्थानीयहोस्ट पर सेट करें। जैसे set LOGONSERVER=\\LOCALHOST मेरे लिए काम किया। नोट: यह चर लॉगऑन पर सेट है और इसे विंडोज वातावरण वैरिएबल विंडो में वैश्विक रूप से बदलना cmd या एक स्क्रिप्ट में सेट करने की तुलना में कोई प्रभाव नहीं पड़ता है।
  • मैं इसे मिनीजीडब्ल्यू/एमएसवाईएस में एक बग मानता हूं। एमएसवाईएस 2 और सिग्विन में कोड अलग है। मैंने MSYS2 की जांच की और इसमें कोई समस्या नहीं है।
संबंधित मुद्दे