2009-12-26 18 views
14

मेरे पास एक प्रोग्राम है जो बहुत धीरे-धीरे चल रहा है (रिलीज पर भी 20 सेकंड की तरह लगता है) इसलिए, इसे ठीक करना चाहते हैं, मैंने विजुअल स्टूडियो के प्रोफाइल में प्रोफाइलर का उपयोग करने की कोशिश की। हालांकि, जब मैं प्रोफाइलिंग सक्षम के साथ प्रोग्राम चलाता हूं, तो यह एक सेकंड से भी कम समय में समाप्त होता है। यह एक बाधा खोजने में बहुत मुश्किल बनाता है। मैं कोड पोस्ट करूंगा लेकिन यह लंबा है। क्या कोई स्पष्ट या स्पष्ट कारण नहीं है कि यह क्यों हो रहा है?जब मैं प्रोफाइलिंग सक्षम करता हूं तो मेरा प्रोग्राम तेजी से क्यों चलता है?

संपादित करें: ठीक है इसलिए मैंने समस्या को मुफ्त() कॉलों के समूह में सीमित कर दिया। जब मैं उन्हें टिप्पणी करता हूं, तो कार्यक्रम उसी समय चलता है जब यह सक्षम प्रोफाइलिंग के साथ करता है। लेकिन अब मेरे पास मेमोरी रिसाव है: -/

+4

शायद यह हेज़ेनबर्ग प्रभाव का कुछ अजीब रूप हो सकता है (http: // en।wikipedia.org/wiki/Werner_Heisenberg)। यह जानता है कि आप देख रहे हैं और इसलिए यह अपने बट से उतर जाता है और काम पर जाता है। :-) –

+1

मुझे लगता है कि यह उसी कारण के लिए होता है जो प्रोग्राम में एक ही बिंदु पर हमेशा होता है, सिवाय इसके कि जब आप इसे डीबगर में चलाते हैं। मनोरंजक लिंक – sepp2k

उत्तर

10

यह Heisenbug जैसा लगता है।

वे वास्तव में होते हैं, और वे उजागर करने के लिए दर्दनाक हो सकते हैं।

- संभवतः कई तरीकों से - बग गायब होने तक आप अपने अनुभव में आपका सबसे अच्छा समाधान बदल सकते हैं।

विभिन्न प्रोफाइलर्स का उपयोग करें। एक प्रोफाइलर का उपयोग करने के बजाय समय कोड जोड़ने का प्रयास करें।

+3

+1 मैं सैम्पलिंग –

0

सामान्य तरीका विभाजित और जीत जाएगा, यानी कार्यक्रम के केवल कुछ हिस्सों को चलाते हैं और देखते हैं कि समस्या कब दूर हो जाती है। लेकिन ऐसा लगता है जैसे आपने पहले ही ऐसा किया है। AFAIK मुक्त आमतौर पर अधिक समय नहीं लेता है, लेकिन स्मृति को खंडित होने पर मॉलोक बहुत समय ले सकता है। यदि आप मुफ्त() नहीं कहते हैं, तो ढेर पहले स्थान पर कभी भी खंडित नहीं होता है। (घुसपैठ प्रोफाइलिंग कोड छोटे डेटा ब्लॉक आवंटित करके और मुक्त अंतराल भरकर स्मृति विखंडन को रोक सकता है - लेकिन मैं मानता हूं कि यह एक कमजोर स्पष्टीकरण है)।

शायद आप मॉलोक और नए कॉल के पहले/बाद में मैन्युअल टाइम मापन कॉल जोड़ सकते हैं और इसे सत्यापित करने के लिए समय प्रिंट कर सकते हैं? हो सकता है कि आप अपने मेमोरी आवंटन पैटर्न का विश्लेषण कर सकें, यह पता लगाने के लिए कि क्या आपके पास ढेर विखंडन समस्या है (शायद कोड को देखकर और अपने सिर में कुछ प्रतीकात्मक डिबगिंग कर ;-)

5

प्रोफाइलर को चालू करने से आपका अंत हो जाएगा कोड (थोड़ा सा) जो शायद समस्या को मुखौटा कर रहा है।

हिसेनबग का सबसे आम कारण प्रारंभिक चर है, दूसरा सबसे आम कारण स्मृति() के बाद स्मृति का उपयोग कर रहा है। अपने नि: शुल्क इसे ठीक कर रहा है के बाद से, आप देर से संदर्भ के लिए देखने के लिए सोच सकते हैं, लेकिन मैं अभी भी पहले अप्रारंभीकृत चर के लिए लगेगा अगर मैं तुम्हें थे।

0

एक घुसपैठ वाले उपकरण प्रोफाइलर के बजाय एक गैर-घुसपैठ नमूना प्रोफाइलर का उपयोग करें।

+1

के लिए – Stewart

0

यह कुछ अनुकूलन के कारण हो सकता है जब आप इसे प्रोफाइलिंग मोड में चलाते समय संकलक द्वारा नहीं किया जा रहा है। इसलिए, मेरा सुझाव है कि आप पारित होने वाले पैरामीटर की जांच करें और कंपाइलर दस्तावेज़ों की जांच करें।

22

इसका कारण यह है कि जब आप विजुअल स्टूडियो के भीतर अपना आवेदन चलाते हैं, तो डीबगर उससे जुड़ा होता है। जब आप प्रोफाइलर का उपयोग करके इसे चलाते हैं, तो डीबगर संलग्न नहीं होता है।

यदि आप रिलीज बिल्ड के साथ भी अपने प्रोग्राम को चलाने के लिए F5 दबाते हैं, तो डीबगर अभी भी संलग्न है।

यदि आप स्वयं से .exe को चलाने का प्रयास करते हैं, या "डीबग> डिबगिंग के बिना स्टार्ट" के साथ आईडीई के माध्यम से प्रोग्राम चलाते हैं (या केवल Ctrl + F5 दबाएं) तो एप्लिकेशन को प्रोफाइलर के साथ जितनी जल्दी हो सके उतना तेज़ चलाना चाहिए।

+0

धन्यवाद का उपयोग कर रहा हूं! यह वास्तव में मेरी मदद की, लेकिन एक और मामले में! – STiLeTT

+1

बिल्कुल सही, यह स्वीकार्य उत्तर होना चाहिए। – cid

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

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