iOS
इंस्ट्रूमेंट्स के साथ प्रोफाइल
खोज…
परिचय
Xcode में इंस्ट्रूमेंट्स नाम का एक परफॉरमेंस ट्यूनिंग एप्लिकेशन शामिल है जिसका उपयोग आप अपने एप्लिकेशन को विभिन्न प्रकार के मेट्रिक्स का उपयोग करके कर सकते हैं। उनके पास सीपीयू उपयोग, मेमोरी उपयोग, लीक, फ़ाइल / नेटवर्क गतिविधि और ऊर्जा उपयोग का निरीक्षण करने के लिए उपकरण हैं, बस कुछ ही नाम के लिए। Xcode से अपने ऐप की रूपरेखा बनाना शुरू करना वास्तव में आसान है, लेकिन कभी-कभी यह समझना उतना आसान नहीं होता है कि आप क्या देख रहे हैं जब यह प्रोफाइलिंग करता है, जो कुछ डेवलपर्स को इस टूल का उपयोग करने में सक्षम बनाता है।
समय Profiler
पहला उपकरण जिसे आप देखेंगे, वह Time Profiler
। मापा अंतराल पर, इंस्ट्रूमेंट्स कार्यक्रम के निष्पादन को रोक देंगे और प्रत्येक चलने वाले धागे पर स्टैक ट्रेस लेंगे। इसे एक्सकोड के डिबगर में ठहराव बटन दबाने के रूप में सोचें। टाइम प्रोफाइलर का एक चुपके पूर्वावलोकन: -
यह स्क्रीन Call Tree
प्रदर्शित करती है। Call Tree
एक ऐप के भीतर विभिन्न तरीकों से निष्पादित समय की मात्रा को दर्शाता है। प्रत्येक पंक्ति एक अलग विधि है जिसे प्रोग्राम के निष्पादन पथ ने अनुसरण किया है। प्रत्येक विधि में बिताया गया समय प्रोफाइलर द्वारा प्रत्येक विधि में रोके जाने की संख्या से निर्धारित किया जा सकता है। उदाहरण के लिए, यदि 100 नमूने 1 मिलीसेकंड के अंतराल पर किए जाते हैं, और 10 नमूनों में एक विशेष विधि स्टैक के शीर्ष पर पाई जाती है, तो आप यह अनुमान लगा सकते हैं कि कुल निष्पादन समय का लगभग 10% - 10 मिलीसेकंड - खर्च किया गया था। उस विधि में। यह एक काफी कच्चा सन्निकटन है, लेकिन यह काम करता है!
Xcode's
मेनू बार से, Product\Profile
, या press ⌘I
। यह ऐप बनाएगा और इंस्ट्रूमेंट्स लॉन्च करेगा। आपको एक चयन विंडो के साथ बधाई दी जाएगी जो इस तरह दिखाई देती है:
ये सभी विभिन्न टेम्पलेट हैं जो इंस्ट्रूमेंट्स के साथ आते हैं।
Time Profiler
इंस्ट्रूमेंट को चुनें और चुनें पर क्लिक करें। यह एक नया इंस्ट्रूमेंट डॉक्यूमेंट खोलेगा। रिकॉर्डिंग शुरू करने और ऐप लॉन्च करने के लिए ऊपर बाईं ओर लाल रिकॉर्ड बटन पर क्लिक करें। अन्य प्रक्रियाओं का विश्लेषण करने के लिए आपको इंस्ट्रूमेंट्स को अधिकृत करने के लिए आपके पासवर्ड के लिए कहा जा सकता है - डर नहीं, यहाँ प्रदान करना सुरक्षित है! इंस्ट्रूमेंट्स विंडो में , आप समय को गिनते हुए देख सकते हैं, और स्क्रीन के केंद्र में ग्राफ के ऊपर बाएं से दाएं तरफ एक छोटा तीर चल रहा है। यह इंगित करता है कि ऐप चल रहा है।
अब, एप्लिकेशन का उपयोग शुरू करें। कुछ छवियों के लिए खोजें, और एक या अधिक खोज परिणामों में ड्रिल करें। आपने शायद देखा है कि खोज परिणाम में जाना थकाऊ रूप से धीमा है, और खोज परिणामों की सूची के माध्यम से स्क्रॉल करना भी अविश्वसनीय रूप से कष्टप्रद है - यह एक बहुत ही भद्दा ऐप है!
ठीक है, आप भाग्य में हैं, क्योंकि आप इसे ठीक करने के लिए तैयार हैं! हालाँकि, आप पहली बार इंस्ट्रूमेंट्स में जो देख रहे हैं, उस पर एक त्वरित रन प्राप्त करने जा रहे हैं। सबसे पहले, सुनिश्चित करें कि टूलबार के दाईं ओर दृश्य चयनकर्ता के पास दोनों विकल्प हैं, जैसे:
यह सुनिश्चित करेगा कि सभी पैनल खुले हैं। अब नीचे दिए गए स्क्रीनशॉट का अध्ययन करें और इसके नीचे प्रत्येक अनुभाग की व्याख्या करें:
1. ये रिकॉर्डिंग कंट्रोल हैं । लाल 'रिकॉर्ड' बटन बंद हो जाएगा और वर्तमान में जब यह क्लिक किया जाता है (यह एक रिकॉर्ड और स्टॉप आइकन के बीच टॉगल होता है) प्रोफाइल को बंद कर देता है। ठहराव बटन वही करता है जो आप चाहते हैं और एप्लिकेशन के वर्तमान निष्पादन को रोक देता है।
2. यह रन टाइमर है। टाइमर गिना जाता है कि ऐप कितने समय से प्रोफाईल चल रहा है, और कितनी बार चलाया गया है। यदि आप बंद कर देते हैं और फिर रिकॉर्डिंग नियंत्रण का उपयोग करके ऐप को पुनरारंभ करते हैं, तो एक नया रन शुरू होगा और प्रदर्शन फिर 2 का रन 2 दिखाएगा।
3. इसे ट्रैक कहा जाता है। आपके द्वारा चुने गए टाइम प्रोफाइलर टेम्प्लेट के मामले में, केवल एक ही साधन है, इसलिए केवल एक ट्रैक है। आप ट्यूटोरियल में बाद में यहाँ दिखाए गए ग्राफ़ की बारीकियों के बारे में अधिक जानेंगे।
4. यह डिटेल पैनल है। यह आपके द्वारा उपयोग किए जा रहे विशेष उपकरण के बारे में मुख्य जानकारी दिखाता है। इस मामले में, यह उन तरीकों को दिखा रहा है जो "सबसे गर्म" हैं - यानी, वे जो सबसे अधिक सीपीयू समय का उपयोग करते हैं। यदि आप शीर्ष पर बार पर क्लिक करते हैं जो कॉल ट्री (बाएं हाथ को एक) कहता है और नमूना सूची का चयन करता है, तो आपको डेटा के एक अलग दृश्य के साथ प्रस्तुत किया जाता है। यह दृश्य हर एक नमूना दिखा रहा है। कुछ नमूनों पर क्लिक करें, और आप विस्तारित विस्तार निरीक्षक में कैप्चर किए गए स्टैक ट्रेस दिखाई देंगे।
5. यह निरीक्षकों का पैनल है। तीन निरीक्षक हैं: रिकॉर्ड सेटिंग्स, प्रदर्शन सेटिंग्स और विस्तारित विवरण। आप जल्द ही इनमें से कुछ विकल्पों के बारे में अधिक जानेंगे।
ड्रिलिंग डीप
एक छवि खोज करें, और परिणामों में ड्रिल करें। मुझे व्यक्तिगत रूप से "कुत्ते" की खोज करना पसंद है, लेकिन जो भी आप चाहते हैं उसे चुनें - आप उन बिल्ली लोगों में से एक हो सकते हैं!
अब, सूची को कुछ समय ऊपर और नीचे स्क्रॉल करें ताकि आपको Time Profiler
में अच्छी मात्रा में डेटा मिल जाए। आपको स्क्रीन बदलने और ग्राफ़ में भरने के बीच में संख्याओं पर ध्यान देना चाहिए; यह आपको बताता है कि सीपीयू साइकिल का उपयोग किया जा रहा है।
आप वास्तव में किसी भी यूआई को क्लंकी के रूप में होने की उम्मीद नहीं करेंगे क्योंकि यह कोई table view
तब तक जहाज करने के लिए तैयार नहीं है जब तक कि यह मक्खन की तरह स्क्रॉल न हो जाए! समस्या को इंगित करने में मदद करने के लिए, आपको कुछ विकल्प निर्धारित करने होंगे।
दाईं ओर, प्रदर्शन सेटिंग निरीक्षक चुनें (or press ⌘+2)
। Call Tree
सेक्शन के तहत इंस्पेक्टर में थ्रेड , इनवर्ट Call Tree
, हाईड मिसिंग सिंबल और हाईड सिस्टम लाइब्रेरी को सेलेक्ट करें। यह इस तरह दिखेगा:
यहां तालिका के बाईं ओर प्रदर्शित डेटा का प्रत्येक विकल्प क्या कर रहा है:
थ्रेड द्वारा अलग: प्रत्येक थ्रेड को अलग से माना जाना चाहिए। यह आपको यह समझने में सक्षम करता है कि सबसे बड़ी मात्रा में सीपीयू उपयोग के लिए कौन से धागे जिम्मेदार हैं।
इनवर्ट कॉल ट्री: इस विकल्प के साथ, stack trace
को ऊपर से नीचे तक माना जाता है। यह आमतौर पर आप क्या चाहते हैं, जैसा कि आप सबसे गहरी विधियों को देखना चाहते हैं जहां सीपीयू अपना समय बिता रहा है।
मिसिंग सिंबल छिपाएँ: यदि dSYM
फ़ाइल आपके ऐप या system framework
लिए नहीं मिल सकती है, तो तालिका में विधि के नाम (प्रतीकों) को देखने के बजाय, आप बस बाइनरी के पते के अनुरूप हेक्स मान देखेंगे। यदि यह विकल्प चुना जाता है, तो केवल पूरी तरह से हल किए गए प्रतीकों को प्रदर्शित किया जाता है और अनसुलझे हेक्स मान छिपाए जाते हैं। इससे प्रस्तुत किए गए डेटा को अस्वीकृत करने में मदद मिलती है।
सिस्टम लाइब्रेरी छिपाएँ: जब यह विकल्प चुना जाता है, तो आपके अपने ऐप के केवल चिह्न प्रदर्शित होते हैं। इस विकल्प का चयन करना अक्सर उपयोगी होता है, क्योंकि आमतौर पर आप केवल इस बात की परवाह करते हैं कि सीपीयू आपके स्वयं के कोड में कहां समय बिता रहा है - आप इस बारे में ज्यादा कुछ नहीं कर सकते हैं कि system libraries
कितना सीपीयू का उपयोग कर रहे हैं!
चपटा पुनरावर्तन: यह विकल्प कई के बजाय प्रत्येक stack trace
में एक प्रविष्टि के रूप में पुनरावर्ती कार्यों (स्वयं को कॉल करने वाले) को मानता है।
शीर्ष कार्य: इसे सक्षम करने से Instruments
किसी फ़ंक्शन में बिताए गए कुल समय को उस फ़ंक्शन के भीतर सीधे समय के योग के साथ-साथ उस फ़ंक्शन द्वारा बुलाए गए कार्यों में बिताए गए समय पर विचार करते हैं।
इसलिए यदि फ़ंक्शन A, B को कॉल करता है, तो A के समय को A के रूप में सूचित किया जाता है, जबकि B में बिताया गया समय बी। यह वास्तव में उपयोगी हो सकता है, क्योंकि यह आपको कॉल स्टैक में उतरते समय हर बार सबसे बड़ा समय लेने देता है, शून्य कर रहा है। अपने सबसे अधिक समय लेने वाली विधियों पर।
यदि आप एक Objective-C
ऐप चला रहे हैं, तो शो ओब्ज-सी ओनली का भी विकल्प है: यदि यह चुना जाता है, तो किसी भी C
या C++
फ़ंक्शन के बजाय केवल Objective-C
तरीके प्रदर्शित किए जाते हैं। आपके कार्यक्रम में कोई भी नहीं है, लेकिन यदि आप एक OpenGL
ऐप को देख रहे हैं, तो इसका उदाहरण कुछ C++
हो सकता है।
यद्यपि कुछ मान थोड़े भिन्न हो सकते हैं, प्रविष्टियों का क्रम नीचे दिए गए विकल्पों को सक्षम करने से पहले एक बार नीचे दी गई तालिका के समान होना चाहिए:
खैर, यह निश्चित रूप से बहुत अच्छा नहीं लगता है। समय का विशाल हिस्सा उस विधि में बिताया जाता है जो थंबनेल तस्वीरों के लिए 'टोनल' फिल्टर को लागू करता है। टेबल लोडिंग और स्क्रॉलिंग यूआई के सबसे बड़े हिस्से थे, और जब टेबल सेल लगातार अपडेट हो रहे होते हैं, तो आपको बहुत ज्यादा झटका नहीं आना चाहिए।
उस पद्धति के भीतर क्या चल रहा है, इसके बारे में अधिक जानने के लिए, तालिका में इसकी पंक्ति पर डबल क्लिक करें। ऐसा करने से निम्नलिखित दृश्य सामने आएगा:
वैसे यह दिलचस्प है, है ना! applyTonalFilter()
एक विधि है जो एक्सटेंशन में UIImage
में जोड़ा गया है, और इसमें बिताया गया लगभग 100 % समय छवि फ़िल्टर को लागू करने के बाद CGImage आउटपुट बनाने में व्यतीत होता है।
वास्तव में इतना नहीं है कि इसे गति देने के लिए किया जा सकता है: छवि बनाना काफी गहन प्रक्रिया है, और इसमें जितना समय लगता है उतना ही समय लगता है। चलो वापस कदम रखने की कोशिश करते हैं और देखते हैं कि applyTonalFilter()
कहां से कहा जाता है। पिछली स्क्रीन पर वापस जाने के लिए कोड दृश्य के शीर्ष पर ब्रेडक्रम्ब ट्रेल में Call Tree
क्लिक Call Tree
:
अब टेबल के ऊपरी भाग में applyTonalFilter पंक्ति के बाईं ओर छोटे तीर पर क्लिक करें। इससे कॉल ट्री को लागू किया जाएगा, जिसमें एप्लिकेशनटाउनफिल्टर का कॉलर दिखाया जाएगा। आपको अगली पंक्ति को भी प्रकट करना पड़ सकता है; जब स्विफ्ट की रूपरेखा तैयार की जाती है, तो कभी-कभी कॉल ट्री में डुप्लिकेट पंक्तियाँ होंगी, जो @objc के साथ उपसर्ग करती है। आप पहली पंक्ति में रुचि रखते हैं, जो आपके ऐप के लक्ष्य नाम (इंस्ट्रूमेंटप्रूफ) के साथ उपसर्ग करती है:
इस स्थिति में, यह पंक्ति परिणाम संग्रह दृश्य के cellForItemAtIndexPath
को संदर्भित cellForItemAtIndexPath
। प्रोजेक्ट से संबद्ध कोड देखने के लिए पंक्ति पर डबल क्लिक करें।
अब आप देख सकते हैं कि समस्या क्या है। तानवाला फ़िल्टर को लागू करने की विधि को निष्पादित करने में एक लंबा समय लगता है, और इसे सीधे cellForItemAtIndexPath से कहा जाता है, जो main thread
(और इसलिए पूरे यूआई) को अवरुद्ध करेगा, जब भी यह फ़िल्टर की गई छवि के लिए पूछेगा।
आवंटन
बनाई जा रही सभी वस्तुओं और उन्हें वापस करने वाली मेमोरी के बारे में विस्तृत जानकारी है; यह आपको प्रत्येक वस्तु की retain counts
भी दर्शाता है। नए instruments profile
साथ नए सिरे से शुरुआत करने के लिए इंस्ट्रूमेंट्स ऐप को छोड़ दें। इस बार, एप्लिकेशन बनाएं और चलाएं, और नेविगेटर क्षेत्र में डीबग नेविगेटर खोलें। फिर मुख्य विंडो में मेमोरी उपयोग के ग्राफ़ प्रदर्शित करने के लिए मेमोरी पर क्लिक करें:
ये रेखांकन इस बात के लिए उपयोगी हैं कि आपका ऐप कैसा प्रदर्शन कर रहा है। लेकिन आपको थोड़ी और शक्ति चाहिए। Profile in Instruments
बटन Profile in Instruments
क्लिक करें और फिर इस सत्र को इंस्ट्रूमेंट्स में लाने के लिए ट्रांसफर करें। एलोकेशन इंस्ट्रूमेंट अपने आप शुरू हो जाएगा।
इस बार आपको दो ट्रैक दिखाई देंगे। एक को अलोकेशन कहा जाता है, और एक को लीक्स कहा जाता है। आवंटन ट्रैक पर बाद में विस्तार से चर्चा की जाएगी; लीक्स ट्रैक आमतौर पर ऑब्जेक्टिव-सी में अधिक उपयोगी है, और इस ट्यूटोरियल में शामिल नहीं किया जाएगा। तो क्या बग आप नीचे ट्रैक करने के लिए जा रहे हैं? इस परियोजना में कुछ ऐसा छिपा है जिसे आप शायद नहीं जानते। आपने स्मृति लीक के बारे में सुना है। लेकिन आप जो नहीं जानते हैं वह यह है कि वास्तव में दो प्रकार के लीक हैं:
सच्ची मेमोरी लीक वह जगह होती है जहां पर किसी वस्तु को अब किसी चीज से संदर्भित नहीं किया जाता है लेकिन फिर भी आवंटित किया जाता है - इसका मतलब है कि मेमोरी को कभी भी दोबारा उपयोग नहीं किया जा सकता है। मेमोरी को प्रबंधित करने में मदद करने वाली स्विफ्ट और ARC
साथ भी, मेमोरी लीक का सबसे आम प्रकार एक retain cycle or strong reference cycle
। यह तब होता है जब दो ऑब्जेक्ट एक दूसरे के लिए मजबूत संदर्भ रखते हैं, ताकि प्रत्येक वस्तु दूसरे को डीलडौल होने से बचाए रखे। इसका मतलब है कि उनकी याददाश्त कभी रिलीज नहीं होती है!
अनबाउंड मेमोरी ग्रोथ वह जगह है जहां मेमोरी को आवंटित किया जाना जारी रहता है और कभी भी डील-डौल होने का मौका नहीं दिया जाता है । यदि यह हमेशा के लिए जारी रहता है, तो कुछ बिंदु पर system's memory
भर जाएगी और आपके हाथ में एक बड़ी मेमोरी समस्या होगी। IOS में इसका मतलब है कि ऐप सिस्टम द्वारा मार दिया जाएगा।
ऐप पर चल रहे एलोकेशन इंस्ट्रूमेंट के साथ, ऐप में पांच अलग-अलग खोजें करें लेकिन अभी तक नतीजों में कोई कमी नहीं आई है। सुनिश्चित करें कि खोजों के कुछ परिणाम हैं! अब ऐप को कुछ सेकंड इंतजार करके थोड़ा व्यवस्थित होने दें।
आपने देखा होगा कि आवंटन ट्रैक में ग्राफ बढ़ रहा है। यह आपको बता रहा है कि मेमोरी आवंटित की जा रही है। यह यह सुविधा है जो आपको unbounded memory growth
खोजने के लिए मार्गदर्शन unbounded memory growth
।
आप जो प्रदर्शन करने जा रहे हैं वह एक generation analysis
। ऐसा करने के लिए, मार्क जनरेशन नामक बटन दबाएं। आपको डिस्प्ले सेटिंग इंस्पेक्टर के शीर्ष पर बटन मिलेगा:
इसे दबाएं और आपको ट्रैक में एक लाल झंडा दिखाई देगा, जैसे:
generation analysis
का उद्देश्य कई बार एक क्रिया करना है, और देखें कि क्या स्मृति एक unbounded fashion
में बढ़ रही है। एक खोज में ड्रिल करें, छवियों को लोड करने के लिए कुछ सेकंड प्रतीक्षा करें, और फिर मुख्य पृष्ठ पर वापस जाएं। फिर पीढ़ी को फिर से चिह्नित करें। अलग-अलग खोजों के लिए इसे बार-बार करें। कुछ खोजों में ड्रिलिंग के बाद, इंस्ट्रूमेंट्स इस तरह दिखेंगे:
इस बिंदु पर, आपको संदेह होना चाहिए। ध्यान दें कि प्रत्येक खोज के साथ नीला ग्राफ़ कैसा हो रहा है, जिसे आप ड्रिल करते हैं। खैर, यह निश्चित रूप से अच्छा नहीं है। लेकिन रुको, memory warnings?
बारे में क्या memory warnings?
आप उन लोगों के बारे में जानते हैं, है ना? Memory warnings
आईओएस के एक ऐप को बताने का तरीका है कि मेमोरी डिपार्टमेंट में चीजें तंग हो रही हैं, और आपको कुछ मेमोरी को खाली करने की आवश्यकता है।
यह संभव है कि यह वृद्धि केवल आपके ऐप के कारण न हो; यह UIKit
की गहराई में कुछ हो सकता है जो स्मृति में है। सिस्टम फ्रेमवर्क और अपने ऐप को या तो एक उंगली इंगित करने से पहले अपनी मेमोरी को खाली करने का मौका दें।
एक अनुकरण memory warning
का चयन करके Instrument\Simulate Memory Warning
, या उपकरण 'मेनू बार में Hardware\Simulate Memory Warning
से simulator's
मेनू पट्टी। आप देखेंगे कि मेमोरी उपयोग थोड़ा कम हो जाता है, या शायद बिल्कुल भी नहीं। निश्चित रूप से वापस नहीं जहां यह होना चाहिए। तो अभी भी कहीं न कहीं स्मृति विकास हो रहा है।
एक खोज में ड्रिलिंग के प्रत्येक पुनरावृत्ति के बाद एक पीढ़ी को चिह्नित करने का कारण यह है कि आप देख सकते हैं कि प्रत्येक पीढ़ी के बीच क्या स्मृति आवंटित की गई है। विस्तार पैनल पर एक नज़र डालें और आप पीढ़ियों का एक समूह देखेंगे।