परफ़ॉर्मेंस मेज़रमेंट और विश्लेषण के उदाहरण

इन उदाहरणों में, कुछ तरह की परफ़ॉर्मेंस से जुड़ी समस्याओं को मेज़र करने और उन्हें बेहतर बनाने के लिए, Macrobenchmark के साथ सिस्टम ट्रेसिंग और मेमोरी प्रोफ़ाइलिंग का इस्तेमाल करने का तरीका बताया गया है.

सिस्टम ट्रेस का इस्तेमाल करके, ऐप्लिकेशन के स्टार्टअप को डीबग करना

स्टार्टअप टाइम की गड़बड़ी को ठीक करते समय, हमारा सुझाव है कि आप systrace लॉग का इस्तेमाल करें. Systrace एक ऐसा सिस्टम है जो पहले से इंस्ट्रुमेंट किए गए कोड का इस्तेमाल करता है. इससे यह पता चलता है कि कुछ इवेंट होने में कितना समय लगता है. इन ट्रेस की मदद से, यह देखा जा सकता है कि आपके ऐप्लिकेशन में क्या हो रहा है. साथ ही, सिस्टम की अन्य प्रोसेस में भी क्या हो रहा है, यह देखा जा सकता है. Android प्लैटफ़ॉर्म और Jetpack लाइब्रेरी में, ऐप्लिकेशन के कई मुख्य इवेंट के लिए इंस्ट्रुमेंटेशन होता है. इन्हें उसी के मुताबिक लॉग किया जाता है. अपने ऐप्लिकेशन में, कस्टम ट्रेस भी जोड़े जा सकते हैं. ये ट्रेस, एक ही systrace विज़ुअलाइज़ेशन टूल में दिखेंगे. इससे आपको ऐप्लिकेशन में हुई गतिविधियों की पूरी जानकारी मिलेगी.

सिस्ट्रैस या परफ़ेटो का इस्तेमाल करना

systrace के बुनियादी इस्तेमाल के बारे में ज़्यादा जानने के लिए, यह वीडियो देखें: Debugging Application Performance.

स्टार्टअप के समय का विश्लेषण करने के लिए, आपको पहले यह समझना होगा कि स्टार्टअप के दौरान क्या होता है. अगर आपको इस पेज पर दी गई जानकारी से ज़्यादा जानकारी चाहिए, तो ऐप्लिकेशन स्टार्टअप समय के बारे में दस्तावेज़ पढ़ें. इसमें ऐप्लिकेशन स्टार्टअप प्रोसेस के बारे में खास जानकारी दी गई है.

ऐप्लिकेशन शुरू होने के ये चरण होते हैं:

  • प्रोसेस शुरू करना
  • सामान्य ऐप्लिकेशन ऑब्जेक्ट शुरू करना
  • गतिविधि बनाना और उसे शुरू करना
  • लेआउट को बड़ा करना
  • पहला फ़्रेम बनाएं

स्टार्टअप के टाइप की ये स्टेज होती हैं:

  • कोल्ड स्टार्ट: यह तब होता है, जब बूट होने के बाद पहली बार ऐप्लिकेशन शुरू किया जा रहा हो या जब ऐप्लिकेशन की प्रोसेस को उपयोगकर्ता या सिस्टम ने बंद कर दिया हो. स्टार्टअप, सेव की गई स्थिति के बिना एक नई प्रोसेस बनाता है.
  • वॉर्म स्टार्ट: ऐसा तब होता है, जब ऐप्लिकेशन पहले से ही बैकग्राउंड में चल रहा हो. हालांकि, गतिविधि को फिर से बनाना और फ़ोरग्राउंड में लाना ज़रूरी होता है. गतिविधि को फिर से बनाया जाता है. इसके लिए, मौजूदा प्रोसेस का इस्तेमाल किया जाता है. इसके अलावा, गतिविधि को सेव की गई स्थिति के साथ फिर से बनाया जाता है. मैक्रोबेंचमार्क टेस्टिंग लाइब्रेरी, पहले विकल्प का इस्तेमाल करके लगातार वार्म स्टार्टअप की टेस्टिंग करती है.
  • हॉट स्टार्ट: ऐसा तब होता है, जब प्रोसेस और गतिविधि अब भी चल रही होती हैं और उन्हें सिर्फ़ फ़ोरग्राउंड में लाने की ज़रूरत होती है. ऐसा हो सकता है कि ज़रूरत के मुताबिक कुछ ऑब्जेक्ट फिर से बनाए जाएं. साथ ही, नई फ़ोरग्राउंड गतिविधि रेंडर की जाए. यह स्टार्टअप का सबसे छोटा सिनारियो है.

हमारा सुझाव है कि डेवलपर के लिए सेटिंग और टूल में उपलब्ध, डिवाइस पर सिस्टम ट्रेसिंग ऐप्लिकेशन का इस्तेमाल करके सिस्ट्रैस कैप्चर करें. अगर आपको कमांड-लाइन टूल इस्तेमाल करने हैं, तो Perfetto का इस्तेमाल Android 10 (एपीआई लेवल 29) और इसके बाद के वर्शन पर किया जा सकता है. वहीं, इससे पहले के वर्शन वाले डिवाइसों को systrace का इस्तेमाल करना चाहिए.

ध्यान दें कि “पहला फ़्रेम” शब्द थोड़ा गलत है, क्योंकि ऐप्लिकेशन, शुरुआती गतिविधि बनाने के बाद स्टार्टअप को अलग-अलग तरीके से हैंडल कर सकते हैं. कुछ ऐप्लिकेशन, कई फ़्रेम तक इन्फ़्लेशन जारी रखेंगे. वहीं, अन्य ऐप्लिकेशन तुरंत दूसरी गतिविधि शुरू कर देंगे.

हमारा सुझाव है कि जब स्टार्टअप पूरा हो जाए, तब आप reportFullyDrawn कॉल (Android 10 और इसके बाद के वर्शन पर उपलब्ध) शामिल करें.

इन सिस्टम ट्रेस में, इन बातों का ध्यान रखें:

लॉक के विवाद की निगरानी करना
पहली इमेज. मॉनिटर की सुरक्षा वाले संसाधनों के लिए प्रतिस्पर्धा होने पर, ऐप्लिकेशन के शुरू होने में काफ़ी समय लग सकता है.

सिंक्रोनस बाइंडर लेन-देन
दूसरी इमेज. अपने ऐप्लिकेशन के ज़रूरी पाथ में, ग़ैर-ज़रूरी लेन-देन खोजें.

एक साथ गार्बेज कलेक्शन
तीसरी इमेज. एक साथ कई गार्बेज कलेक्शन होना आम बात है और इसका असर कम होता है. हालांकि, अगर ऐसा बार-बार हो रहा है, तो Android Studio के मेमोरी प्रोफ़ाइलर की मदद से इसकी जाँच करें.

स्टार्टअप के समय I/O
चौथी इमेज. स्टार्टअप के दौरान I/O की जांच करें और लंबे समय तक होने वाली रुकावटों का पता लगाएं.

चौथे फ़िगर में, ध्यान दें कि एक ही समय पर I/O करने वाली अन्य प्रोसेस, I/O कंटेंशन का कारण बन सकती हैं. इसलिए, पक्का करें कि अन्य प्रोसेस न चल रही हों.

अन्य थ्रेड पर होने वाली ज़्यादा गतिविधि, यूज़र इंटरफ़ेस (यूआई) थ्रेड में रुकावट डाल सकती है. इसलिए, स्टार्टअप के दौरान बैकग्राउंड में होने वाले काम पर ध्यान दें. ध्यान दें कि डिवाइसों में सीपीयू के अलग-अलग कॉन्फ़िगरेशन हो सकते हैं. इसलिए, एक साथ चलने वाले थ्रेड की संख्या, डिवाइसों के हिसाब से अलग-अलग हो सकती है.

जंक के सामान्य सोर्स के बारे में जानकारी देने वाली गाइड भी देखें

Android Studio के मेमोरी प्रोफ़ाइलर का इस्तेमाल करना

Android Studio का मेमोरी प्रोफ़ाइलर एक बेहतरीन टूल है. इसकी मदद से, मेमोरी पर पड़ने वाले दबाव को कम किया जा सकता है. यह दबाव, मेमोरी लीक या मेमोरी के गलत इस्तेमाल की वजह से पड़ सकता है. इससे ऑब्जेक्ट के असाइनमेंट और कलेक्शन का लाइव व्यू मिलता है.

अपने ऐप्लिकेशन में मेमोरी से जुड़ी समस्याओं को ठीक करने के लिए, मेमोरी प्रोफ़ाइलर का इस्तेमाल किया जा सकता है. इससे यह ट्रैक किया जा सकता है कि गार्बेज कलेक्शन क्यों और कितनी बार होता है. साथ ही, यह भी पता लगाया जा सकता है कि क्या मेमोरी लीक की वजह से, समय के साथ आपका हीप लगातार बढ़ रहा है.

ऐप्लिकेशन की मेमोरी की प्रोफ़ाइलिंग को इन चरणों में बांटा जा सकता है:

1. मेमोरी से जुड़ी समस्याओं का पता लगाना

मेमोरी से जुड़ी समस्याओं का पता लगाने के लिए, अपने ऐप्लिकेशन के लिए मेमोरी प्रोफ़ाइलिंग सेशन रिकॉर्ड करें. इसके बाद, ऐसे ऑब्जेक्ट को ढूंढें जिसका मेमोरी फ़ुटप्रिंट बढ़ रहा है. इससे आखिर में, गार्बेज कलेक्शन इवेंट ट्रिगर होता है.

ऑब्जेक्ट की संख्या बढ़ाना
पांचवीं इमेज. मेमोरी प्रोफ़ाइलर में, समय के साथ ऑब्जेक्ट के बढ़े हुए ऐलोकेशन दिख रहे हैं.

गार्बेज कलेक्शन
छठी इमेज. गार्बेज कलेक्शन इवेंट दिखाने वाला मेमोरी प्रोफ़ाइलर.{.:image-caption}

मेमोरी पर ज़्यादा दबाव डालने वाले इस्तेमाल के उदाहरण की पहचान करने के बाद, इसकी मुख्य वजहों का विश्लेषण करना शुरू करें.

2. मेमोरी प्रेशर वाली जगहों का पता लगाना

टाइमलाइन में कोई रेंज चुनें, ताकि दोनों तरह के साइज़ (ऐलोकेशन और शैलो) को विज़ुअलाइज़ किया जा सके.

डेटा को विज़ुअलाइज़ करना और शैलो साइज़ देखना
सातवीं इमेज. मेमोरी प्रोफ़ाइलर, टाइमलाइन में चुनी गई रेंज के लिए मेमोरी के बंटवारे और साइज़ को दिखाता है.

इस डेटा को क्रम से लगाने के कई तरीके हैं. यहां दिए गए सेक्शन में, कुछ उदाहरण दिए गए हैं. इनसे आपको यह समझने में मदद मिलेगी कि हर व्यू से, समस्याओं का विश्लेषण कैसे किया जा सकता है.

क्लास के हिसाब से क्रम में लगाना

क्लास के हिसाब से व्यवस्थित करने की सुविधा तब काम आती है, जब आपको ऐसी क्लास ढूंढनी हों जो ऐसे ऑब्जेक्ट जनरेट कर रही हैं जिन्हें कैश मेमोरी में सेव किया जाना चाहिए या मेमोरी पूल से फिर से इस्तेमाल किया जाना चाहिए.

उदाहरण के लिए, मान लें कि आपको कोई ऐसा ऐप्लिकेशन दिखता है जो हर सेकंड “Vertex” नाम की क्लास के 2,000 ऑब्जेक्ट बना रहा है. इससे हर सेकंड में, असाइनमेंट की संख्या में 2,000 की बढ़ोतरी होगी. इसे क्लास के हिसाब से क्रम से लगाने पर देखा जा सकता है. क्या ऐसे ऑब्जेक्ट को फिर से इस्तेमाल किया जाना चाहिए, ताकि इस तरह का गार्बेज जनरेट न हो? अगर जवाब हां है, तो हो सकता है कि आपको मेमोरी पूल लागू करना पड़े.

कॉलस्टैक के हिसाब से व्यवस्थित करें

कॉलस्टैक के हिसाब से व्यवस्थित करने की सुविधा तब काम आती है, जब कोई ऐसा हॉट पाथ होता है जहां मेमोरी को असाइन किया जा रहा होता है. जैसे, लूप के अंदर या कोई खास फ़ंक्शन, मेमोरी को असाइन करने का ज़्यादा काम कर रहा हो. कॉलस्टैक के हिसाब से देखने पर, आपको ये हॉटस्पॉट दिखेंगे.

शैलो साइज़ बनाम रिटेन किया गया साइज़

शैलो साइज़, सिर्फ़ ऑब्जेक्ट की मेमोरी को ट्रैक करता है. इसलिए, यह उन सामान्य क्लास को ट्रैक करने के लिए सबसे ज़्यादा फ़ायदेमंद है जिनमें मुख्य रूप से प्रिमिटिव शामिल होते हैं.

बनाए रखा गया साइज़, ऑब्जेक्ट को सीधे तौर पर असाइन की गई कुल मेमोरी दिखाता है. साथ ही, यह उन अन्य ऑब्जेक्ट को असाइन की गई मेमोरी भी दिखाता है जिन्हें सिर्फ़ ऑब्जेक्ट से रेफ़रंस दिया गया है. यह जटिल ऑब्जेक्ट की वजह से मेमोरी पर पड़ने वाले दबाव को ट्रैक करने के लिए उपयोगी है. इन ऑब्जेक्ट के लिए, सिर्फ़ प्रिमिटिव फ़ील्ड ही नहीं, बल्कि अन्य ऑब्जेक्ट को भी मेमोरी में जगह देनी होती है. यह वैल्यू पाने के लिए, मेमोरी प्रोफ़ाइलर का इस्तेमाल करके मेमोरी डंप बनाएं. उस हीप में असाइन किए गए ऑब्जेक्ट, डिसप्ले में जोड़ दिए जाते हैं.

पूरी मेमोरी डंप
आठवीं इमेज. मेमोरी प्रोफ़ाइलर टूलबार में, Java हीप डंप करें बटन पर क्लिक करके, किसी भी समय मेमोरी डंप बनाया जा सकता है.

कॉलम के तौर पर जोड़ा गया
नौवीं इमेज. मेमोरी डंप बनाने पर, एक कॉलम दिखता है. इसमें उस हीप में ऑब्जेक्ट के लिए मेमोरी का बंटवारा दिखाया जाता है.

3. ऑप्टिमाइज़ेशन के असर का आकलन करना

मेमोरी ऑप्टिमाइज़ेशन में सुधार का एक ऐसा उदाहरण जिसे आसानी से मेज़र किया जा सकता है, वह है गार्बेज कलेक्शन. ऑप्टिमाइज़ेशन से मेमोरी पर पड़ने वाला दबाव कम होने पर, आपको कम गार्बेज कलेक्शन (जीसी) दिखेंगे. इसे मेज़र करने के लिए, प्रोफ़ाइलर टाइमलाइन में जीसी के बीच के समय को मेज़र करें. मेमोरी ऑप्टिमाइज़ेशन के बाद, आपको जीसी के बीच ज़्यादा समय दिखेगा.

मेमोरी से जुड़े इन सुधारों का असर यह होता है:

  • अगर ऐप्लिकेशन पर मेमोरी का दबाव लगातार नहीं रहता है, तो मेमोरी से जुड़ी समस्याओं की वजह से ऐप्लिकेशन को कम बार बंद किया जाएगा.
  • कम GC होने से, जंक मेट्रिक बेहतर होती हैं. ऐसा इसलिए होता है, क्योंकि जीसी की वजह से सीपीयू पर लोड बढ़ जाता है. इससे रेंडरिंग टास्क को तब तक के लिए टाला जा सकता है, जब तक जीसी की प्रोसेस पूरी नहीं हो जाती.