2011-01-20 10 views
7

मेरे पास एक सी ++ एप्लिकेशन है जहां "हटाएं" फ़ंक्शन चलाने में धीमा है। इसका क्या कारण हो सकता है और मुझे समाधान के लिए अपनी खोज कहां शुरू करनी चाहिए?सी ++ "हटाएं" धीमा है। मुझे पहले कहाँ देखना चाहिए?

पृष्ठभूमि:

यह सी ++ कोड एक ARX ऑटोकैड, जो मूल रूप से सिर्फ एक DLL है के अंदर चल रहा है फ़ाइल में है।

विशिष्ट कंप्यूटर जहां हटाना धीमा है ऑटोकैड 2011, विंडोज 7, 64-बिट चल रहा है। ऑटोकैड 2011 के लिए एआरएक्स को विजुअल स्टूडियो 2008 सर्विस पैक 1 का उपयोग करके संकलित किया जाना है।

समस्या वाला कंप्यूटर ग्राहक का कंप्यूटर है। इसमें विजुअल स्टूडियो का कोई संस्करण स्थापित नहीं है।

मेरे विकास कंप्यूटर पर, कोड का परीक्षण करने के ऑटोकैड 2011

में कोई समस्या नहीं है, मैं कुछ कोड है कि एक लिंक्ड सूची को हटा देता है। समस्या के साथ कंप्यूटर पर, सूची को हटाने के लिए 0.7 सेकंड लगते हैं। समस्या के बिना कंप्यूटर और कॉन्फ़िगरेशन पर, एक ही कोड 0.02 सेकंड लेता है। विशिष्ट समय महत्वपूर्ण नहीं हैं - दो संख्याओं के बीच बड़ा अंतर है।

मैंने सुनिश्चित किया है कि दोनों कंप्यूटरों पर कोड का एक ही संस्करण चलाना सुनिश्चित हो, इसलिए यह एक रिलीज बनाम डीबग बिल्ड समस्या नहीं है।

+1

सूची में कितने आइटम थे, और उनका आकार क्या था? –

+2

बेंचमार्क के लिए उपयोग कर रहे परीक्षण कोड को साझा करें। – karlphillip

+0

और क्या आप दोनों प्रणालियों पर स्थिर/गतिशील रूप से लिंक कर रहे हैं? और कृपया पुष्टि करें कि आप डीबग/रिलीज बिल्ड की तुलना नहीं कर रहे हैं? –

उत्तर

5

मोटे तौर पर क्रम में मैं उन्हें जाँच चाहते हैं:

  • अन्य प्लगइन्स: कि व्यवहार अन्य ARX फ़ाइलों की वजह से हो सकता है? क्या उन्हें खराब प्रणाली पर अक्षम किया जा सकता है?
  • PerfMon: जांचें कि क्या आपके डिलीट के दौरान मुलायम/हार्ड पेज दोष या कैश चोटी की याद आती है (मुझे उम्मीद है कि आप इसे कंप्यूटर कंप्यूटर पर सेट कर सकते हैं)।
  • HeapQueryInformation: अच्छे/खराब वातावरण में समान मूल्य?
  • हीप लॉक: क्या कुछ अन्य धागे पृष्ठभूमि में अत्यधिक सक्रिय हो सकते हैं, ढेर के ताले पर कसकर पकड़ सकते हैं? आप हेप लॉक/हीप अनलॉक (और लॉक के अंदर समय) में लूप को लपेटकर परीक्षण कर सकते हैं।
  • हुक: क्या संबंधित कोड को लगाया जा सकता है? (उदाहरण के लिए सी ++/Win32 हीप फ़ंक्शंस में जो भी करना है, उसे करने के लिए एक तृतीय पक्ष ऐप)
  • स्ट्रॉ पर ग्रासिंग: संबंधित new असामान्य रूप से लंबा लेता है? व्यक्तिगत delete बार वितरित कैसे होते हैं?
1

काम/असफल प्रणाली के बीच विभिन्न कैश दक्षता के कारण हो सकता है। विफल प्रणाली पर अधिक स्मृति विखंडन हो सकता है जो कैश को फेंकने के लिए बड़ी हटा देता है। एक quiescent प्रणाली पर डेटा अधिक अनुक्रमिक समाप्त हो सकता है और बड़े हटाने के दौरान और अधिक कैश हिट हो सकता है।

इंटेल प्रदर्शन काउंटर मॉनिटर आज़माएं?

1

यदि यह स्वीकार्य और संभव है, तो ग्राहक के कंप्यूटर पर एक प्रोफाइलर का उपयोग करने का प्रयास करें।

आप AMD CodeAnalyst या इंटेल प्रोफाइलर (हालांकि वह एक मुक्त नहीं है) का प्रयास कर सकते हैं।

यदि यह संभव नहीं है, तो अपनी रिलीज के लिए प्रोफाइलिंग कोड जोड़ें और ग्राहक से परिणाम इकट्ठा करें। यहां तक ​​कि सरल प्रोफाइलिंग कोड आपको वास्तविक बाधा खोजने में मदद कर सकता है।

ऐसा लगता है कि डिलीट स्वयं ही समस्या नहीं है, लेकिन समस्या कोड का कुछ अन्य हिस्सा हो सकती है।

उदा। - head->resval.rstring का प्रकार क्या है?

0

हम इस समय हर समय दौड़ते हैं। यह आपके कोड के साथ कुछ भी गलत नहीं है, रिलीज मोड में हजारों वस्तुओं को हटाने में कई सेकंड लग सकते हैं (और मैंने इसे मिनट तक भी देखा है)।

उत्तर हटाने के लिए नहीं है। अपने आप को एक वास्तविक स्मृति आवंटक प्राप्त करें, और व्यक्तिगत रूप से प्रत्येक ऑब्जेक्ट आवंटित करने के बजाय एक मेमोरी पूल (या एक कस्टम ढेर या जिसे आप इसे कॉल करना चाहते हैं) बनाते हैं। Nedmalloc वह है जिसे हम उपयोग करते हैं और अनुशंसा करते हैं, और आप "नेडपूल" बना सकते हैं। असल में, पूल मेमोरी का एक ब्लॉक है जहां आपकी ऑब्जेक्ट आवंटित की जाएंगी। आप अभी भी प्रत्येक ऑब्जेक्ट के लिए स्मृति आवंटित करते हैं, लेकिन इसे ओएस से सीधे पूल से लिया जाता है।

जब हटाने का समय आता है, तो आप वस्तुओं को एक-एक करके हटाने के बजाय पूरे पूल को हटा देते हैं। ऑब्जेक्ट्स के प्रत्येक बैच के लिए एक अलग पूल का उपयोग करें जो एक ही समय में समाप्त हो जाएगा। आपको पूरे पूल के लिए मेमोरी आवंटित करने की आवश्यकता नहीं है, लेकिन आप केवल एक ही चीज़ को हटा सकते हैं।

+0

यदि आप ऐसा करते हैं तो अधिकांश सी ++ ऑब्जेक्ट्स में अपरिभाषित व्यवहार होता है। आपको कम से कम निहित वस्तुओं के विनाशकों के लिए व्यवस्था करने की आवश्यकता है। –

+0

बेशक। आपको नए स्थान का उपयोग करने की आवश्यकता है और फिर स्वयं को विनाशक को मैन्युअल रूप से कॉल करने की आवश्यकता है, लेकिन स्मृति को अस्वीकार न करें। –

0

रीटेललिस्ट कैसे उत्पन्न की जा रही है? इसके अतिरिक्त, क्या कोई कारण है कि आप acutNewRb और acutRelRb का उपयोग करने के बजाय मैन्युअल रूप से resbufs को आवंटित और हटा रहे हैं?

इसके अलावा, आपने शायद इन्हें चेक किया है, लेकिन क्या उपयोगकर्ता के पास ऑटोकैड 200 9 और 2011 दोनों में डिफ़ॉल्ट ड्राइंग लोड है? यदि नहीं, तो चित्र समान हैं (ACAD संस्करण को छोड़कर), और क्या वे स्थानीय रूप से या नेटवर्क ड्राइव पर स्थित हैं? आप यह भी देख सकते हैं कि उपयोगकर्ता के पास एक ही lisp/.Net/objectARX अनुप्रयोग दोनों उदाहरणों में चल रहे हैं या नहीं। साथ ही, ऑटोकैड 2011 एक नेटवर्क या स्थानीय स्थापना है?

अंत में, आप प्रश्न में ऑटोकाड और ऑब्जेक्टर्स टैग जोड़ना चाहेंगे।

+0

AcutBuildList का उपयोग कर retlist उत्पन्न किया जा रहा है। मैं स्मृति जारी करने के लिए acutRelRb का उपयोग कर रहा था, लेकिन कोड प्रोफाइलिंग करते समय, मैंने पाया कि यह कार्य समस्या है। मैं यह देखने के लिए मैन्युअल रूप से दोनों को फिर से लिखता हूं कि क्या समस्या ठीक हो जाएगी (ऐसा नहीं हुआ) और ताकि मुझे समस्या का कारण बनने का बेहतर विचार हो। सभी मामलों में मैं एक ही ड्राइंग पर कोड चला रहा हूं। –

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

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