2013-09-24 6 views
5

मैं एक बहुप्रचारित प्लगइन पर काम कर रहा हूं। जब मैं स्मृति के बहुत बड़े ब्लॉक (> 10 एमबी) पर एक मुफ्त() करता हूं तो मेरी प्लगइन के साथ एप्लिकेशन अस्थायी रूप से बहुत धीमा हो जाता है। (यह एक ऑडियो ऐप है, ऑडियो थ्रेड बहुत कम समय मिलता है)। मुझे यकीन नहीं है कि क्या मुफ्त() बहुत सी CPU का उपयोग कर रहा है या यह अन्य धागे को बहुत लंबा रास्ता अवरुद्ध कर रहा है। ऐसा लगता है कि Madvice() के लिए एक कॉल बहुत काम कर रहा है। मुझे मुफ्त में उपयोग करने के लिए उपयोग किया जाता है() ज्यादा समय नहीं लेता है (यह तब नहीं होता जब मैं 32 बिट्स मोड में चलाता हूं)।मुफ्त() अन्य धागे को अवरुद्ध करना, सिस्टम मंदी

कुछ जानकारी: OSX 10.8 64 बिट्स प्लगइन & कार्यक्रम सी ++

जारी रखने के लिए कैसे पर कोई सुझाव बहुत स्वागत है।

+0

शायद मुफ्त में बहुत अधिक समय लग रहा है क्योंकि यह डिबगिंग उद्देश्यों के लिए स्मृति को साफ़ करता है। मुक्त संस्करण प्राप्त करें जो ऐसा नहीं करता .. –

+0

क्या आप प्रोग्राम को वाद्य यंत्र बना सकते हैं - ओएस एक्स पर यह उपकरणों का उपयोग करना वास्तव में आसान है। यह आपको बताएगा कि आपका कार्यक्रम वास्तव में अपना अधिकांश समय कहां खर्च कर रहा है। – parry

+0

आपको किसी भी वास्तविक समय प्राथमिकता ऑडियो कॉलबैक थ्रेड पर स्मृति आवंटन या डेलोकेशन से बचना चाहिए। [तकनीकी क्यू एंड ए क्यूए 1467: कोरऑडियो ओवरलोड चेतावनी] में सिफारिशें देखें (https://developer.apple.com/library/mac/qa/qa1467/_index.html)। मॉलोक कार्यान्वयन थ्रेड-सुरक्षा के लिए ताले लेता है। –

उत्तर

2

एक स्पष्ट सुझाव निश्चित रूप से free() (जो सी ++ में delete का कुछ रूप होना चाहिए) को रोकने के लिए होगा।

जब तक आपकी प्लगइन अभी भी लोड और सक्रिय (या शायद "चल रही") स्मृति को मुक्त न करें, तब संसाधनों को मुक्त करें जब प्लगइन को अब आसपास होने की आवश्यकता नहीं है।

यदि आपको पुराने को खाली करने के बाद एक नया बफर फिर से आवंटित करने की आवश्यकता है, तो इसके बजाय पहले से आवंटित स्मृति का पुनः उपयोग करने का तरीका जानें।

+0

+1 इस तरह से मैंने सिंक्रनाइज़ किए गए रीयलटाइम वीडियो प्लेयर में ऐसा करने का तरीका समाप्त किया। –

+0

मेरी इच्छा है कि मैं ऐसा कर सकता हूं, मेरी मेमोरी आवश्यकताएं चुनिंदा प्रीसेट पर निर्भर हैं। – jankoen

0

यदि आप मेमोरी का पुन: उपयोग करते हैं, शायद प्लेसमेंट new के साथ, तो आप कॉल को free/delete पर पूरी तरह से छुटकारा पा सकते हैं।

0

यदि बफर एक ही आकार या लगभग है तो आप मुफ्त में देरी से लाभ उठा सकते हैं, और इसके बजाय एक realloc() का उपयोग कर सकते हैं। यह trickier हो सकता है।

0

बड़े आवंटन के लिए अब मैं vm_allocate() का उपयोग करता हूं जो एक लंबे पागल() को कॉल नहीं करता है।

चूंकि मैं vm_allocate() और इसके समकक्ष vm_deallocate() का उपयोग करता हूं, सभी मेमोरी रिलीजिंग कॉल फिर से तेज़ होते हैं।

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