Android में, कई तरह की परफ़ॉर्मेंस प्रोफ़ाइलें रिकॉर्ड की जा सकती हैं. प्रोफ़ाइल इकट्ठा करने से, आपको इन समस्याओं को डीबग करने में मदद मिलती है: आपका ऐप्लिकेशन कितनी तेज़ी से चलता है, यह कितनी मेमोरी का इस्तेमाल करता है, यह कितनी बैटरी खर्च करता है वगैरह.
इस दस्तावेज़ में, सबसे ज़्यादा काम आने वाली प्रोफ़ाइल के टाइप के बारे में बताया गया है. साथ ही, परफ़ॉर्मेंस से जुड़ी सामान्य समस्याओं को डीबग करने के लिए, हर टाइप का इस्तेमाल कब करना चाहिए, यह भी बताया गया है.
सिस्टम ट्रेस
सिस्टम ट्रेस एक पावरफ़ुल प्रोफ़ाइल होती है. इसमें प्रोसेस, थ्रेड, टाइमिंग की जानकारी, सीपीयू और टास्क के एक्ज़ीक्यूशन, और सिस्टम या उपयोगकर्ता के तय किए गए इवेंट के बारे में जानकारी होती है.
ऐप्लिकेशन के हिसाब से, ट्रेस में मौजूद जानकारी कई तरह की हो सकती है. जैसे, लेटेन्सी, जंक, मेमोरी, बैटरी वगैरह.
सिस्टम ट्रेस में, कोड से ट्रिगर होने वाले ये इवेंट शामिल होते हैं. इन्हें सिस्टम या उपयोगकर्ता के हिसाब से तय किया जा सकता है. कोड के ज़रिए ट्रिगर किए जाने वाले इवेंट ऐसे इवेंट होते हैं जिन्हें उपयोगकर्ता फ़ंक्शन कॉल के ज़रिए ट्रिगर कर सकते हैं.
- ट्रेस स्लाइस: ये आपके कोड में अलग-अलग पॉइंट के बीच के समय को दिखाते हैं. इन्हें
Trace.beginSectionऔरTrace.endSectionएपीआई की मदद से जोड़ा जा सकता है. - ट्रेस काउंटर: ये ऐसी संख्यात्मक वैल्यू होती हैं जो मेट्रिक को दिखाती हैं. उदाहरण के लिए, हीप साइज़. इन्हें
Trace.setCounterएपीआई की मदद से जोड़ा जा सकता है.
सिस्टम ट्रेस में मेट्रिक भी शामिल होती हैं. इन्हें PerfettoSQL क्वेरी से बनाया जा सकता है. इनका इस्तेमाल विश्लेषण करने या ट्रेस की तुलना करने के लिए किया जा सकता है.
हमारा सुझाव है कि सिस्टम ट्रेस का इस्तेमाल करके, ये काम करें:
लेटेंसी से जुड़ी समस्याओं का पता लगाना. सिस्टम ट्रेस, इंतज़ार, देरी या शेड्यूल करने से जुड़ी समस्याओं की वजह से होने वाली देरी का पता लगाने के लिए बेहतरीन होते हैं. सैंपल पर आधारित प्रोफ़ाइलर जैसे अन्य प्रोफ़ाइलर, समय की वह जानकारी नहीं देते जो सिस्टम ट्रेस देते हैं.
डुप्लीकेट कैलकुलेशन ढूंढें. ट्रेसिंग से यह पता चल सकता है कि क्या कुछ कैलकुलेशन दोहराई जा रही हैं. इससे गैर-ज़रूरी कार्रवाइयों का पता चल सकता है.
लॉक कंटेंशन की समस्याओं का पता लगाना. थ्रेड की स्थितियों और संसाधनों के ब्लॉक होने के समय को दिखाने वाले स्लाइस की जानकारी की मदद से, यह पता लगाया जा सकता है कि क्या लॉक (जैसे,
synchronizedब्लॉक) की वजह से उपयोगकर्ता के सफ़र में देरी हो रही है.अपने ऐप्लिकेशन में मल्टी-थ्रेडिंग को समझें. ट्रेस, कई थ्रेड का व्यू देते हैं. इसमें हर थ्रेड की स्थिति और सिस्टम या आपके ऐप्लिकेशन से जोड़े गए किसी भी ट्रेस स्लाइस को दिखाया जाता है. इस मल्टी-थ्रेड व्यू से, आपको यह समझने में मदद मिलती है कि कौनसी थ्रेड चालू हैं, कौनसी स्लीपिंग मोड में हैं या वे क्या चला रही हैं और वे कैसे इंटरैक्ट करती हैं.
परफ़ॉर्मेंस का जटिल विश्लेषण करना. सिस्टम ट्रेस में मौजूद यूज़र इंटरफ़ेस और अलग-अलग तरह की जानकारी दिखाने की सुविधा की वजह से, परफ़ॉर्मेंस से जुड़ी कई समस्याओं को डीबग करने में मदद मिलती है. जैसे, लेटेन्सी, मेमोरी, और बैटरी खर्च.
सिस्टम ट्रेस में, PerfettoSQL का इस्तेमाल करके क्वेरी करने की सुविधा भी उपलब्ध होती है. इस बेहतरीन सुविधा की मदद से, ये काम किए जा सकते हैं:
- किसी खास तरह का डेटा एक्सट्रैक्ट करना.
- ट्रेस डेटा को कस्टम मेट्रिक में बदलें.
- क्वेरी से डीबग ट्रैक बनाएं, ताकि Perfetto यूज़र इंटरफ़ेस (यूआई) में उन चीज़ों को आसानी से विज़ुअलाइज़ किया जा सके जो आपके लिए सबसे ज़्यादा अहम हैं.
- Perfetto के यूज़र इंटरफ़ेस (यूआई) में सीधे तौर पर मुश्किल विश्लेषण करें.
स्टैक सैंपल प्रोफ़ाइलें
स्टैक सैंपल प्रोफ़ाइलें, कोड के एक्ज़ीक्यूशन के सैंपल रिकॉर्ड करती हैं. साथ ही, कॉल स्टैक की जानकारी को तय की गई दर पर सेव करती हैं. ऐसा तब होता है, जब कोई थ्रेड सीपीयू पर टास्क चला रही हो. इससे यह जानकारी मिलती है कि कोड को चलाने के दौरान क्या हो रहा है.
हमारा सुझाव है कि स्टैक सैंपल का इस्तेमाल इन कामों के लिए करें:
- हॉटस्पॉट ऑप्टिमाइज़ करें. स्टैक सैंपल से, आपके कोड के उन हिस्सों की पहचान करने में मदद मिलती है जिनमें सीपीयू का इस्तेमाल ज़्यादा होता है. इसका मतलब है कि थ्रेड अक्सर "चल रही है" स्थिति में होता है.
- कोड को लागू करने के तरीके को समझना. स्टैक के सैंपल से, आपको अपने कोडबेस के पूरे व्यवहार को समझने में मदद मिल सकती है.
- ऐसे कोड की पहचान करें जिन्हें नहीं चलना चाहिए. आपको ऐसे कॉल स्टैक मिल सकते हैं जिन्हें चलना ही नहीं चाहिए था. इससे ऑप्टिमाइज़ेशन के लिए तुरंत उपलब्ध अवसरों का पता चलता है.
हीप डंप
Java हीप डंप से, आपके ऐप्लिकेशन की Java हीप मेमोरी का स्नैपशॉट दिखता है. इस स्नैपशॉट में सभी ऑब्जेक्ट और डंप लिए जाने के समय वे एक-दूसरे को कैसे रेफ़र करते हैं, इसकी जानकारी शामिल होती है.
हमारा सुझाव है कि हीप डंप इकट्ठा करके, ये काम करें:
- डुप्लीकेट ऑब्जेक्ट का पता लगाएं. हीप डंप से लाइव ऑब्जेक्ट की संख्या का पता चलता है. इससे डुप्लीकेट ऑब्जेक्ट को ट्रैक करने में मदद मिलती है. ये ऑब्जेक्ट रेफ़रंस भी देते हैं. इससे आपको कोड की उस जगह का पता चलता है जहां ऑब्जेक्ट बनाए गए थे.
- मेमोरी लीक का पता लगाना. हीप डंप से ऐसी मेमोरी का पता चल सकता है जिसका इस्तेमाल डंप लिए जाने के समय नहीं किया जाना चाहिए था. इससे मेमोरी लीक होने की संभावना का पता चलता है.
- उन ऑब्जेक्ट की पहचान करें जिन्हें ऑप्टिमाइज़ किया जा सकता है. ढेर डंप में, ज़्यादा मेमोरी इस्तेमाल करने वाली चीज़ें और उनकी संख्या दिखाई जाती है. इससे, मेमोरी के इस्तेमाल के खराब पैटर्न की पहचान करने में मदद मिलती है.
हीप प्रोफ़ाइल
हीप प्रोफ़ाइलें, नेटिव और Java, दोनों वर्शन में उपलब्ध होती हैं. ये मेमोरी से जुड़ी समस्याओं को डीबग करने के लिए बेहतरीन होती हैं. ये कॉल स्टैक सैंपल की तरह ही होते हैं. हालांकि, सीपीयू साइकल को मेज़र करने के बजाय, ये तब सैंपल लेते हैं, जब मेमोरी असाइन की जाती है.
हमारा सुझाव है कि इन कामों के लिए, हीप प्रोफ़ाइल का इस्तेमाल करें:
- मेमोरी चर्न को कम करें. हीप प्रोफ़ाइलें, मेमोरी के बंटवारे के लिए कोड की लोकेशन के साथ सैंपल उपलब्ध कराती हैं. इससे आपको उन जगहों की पहचान करने में मदद मिलती है जहां कई अस्थायी ऑब्जेक्ट बनाए जाते हैं. इससे आपके ऐप्लिकेशन में बार-बार गार्बेज कलेक्शन (जीसी) हो सकता है.
- मेमोरी लीक का पता लगाना. मेमोरी लीक का पता लगाने और उन्हें ठीक करने के लिए, हीप प्रोफ़ाइलों का इस्तेमाल अन्य मेमोरी प्रोफ़ाइलों के साथ किया जा सकता है. इनसे आपको उन जगहों का पता लगाने में मदद मिलती है जहां उम्मीद से ज़्यादा मेमोरी इस्तेमाल हो रही है.
प्रोफ़ाइलें मर्ज करना
ज़्यादातर मामलों में, आपको एक ही प्रोफ़ाइल का इस्तेमाल करके परफ़ॉर्मेंस का विश्लेषण करना होगा. हालांकि, एक से ज़्यादा प्रोफ़ाइल या एक ही मिली-जुली प्रोफ़ाइल से अक्सर ज़्यादा जानकारी मिलती है. इससे उन जटिल समस्याओं का पता लगाने में मदद मिलती है जिनका पता सिर्फ़ एक प्रोफ़ाइल से नहीं लगाया जा सकता.
यहां कुछ ऐसे उदाहरण दिए गए हैं जिनमें प्रोफ़ाइलों को मर्ज करना फ़ायदेमंद होता है:
पहला उदाहरण: ऐसे कोड की जांच करना जिसमें इंस्ट्रुमेंटेशन नहीं किया गया है. सिस्टम ट्रेस से, उन कार्रवाइयों के लिए इंतज़ार का समय दिख सकता है जिन्हें आपने पहले ही इंस्ट्रुमेंट किया है. हालांकि, आपको उन समय के दौरान चलने वाले कोड के उन हिस्सों के बारे में ज़्यादा जानकारी चाहिए हो सकती है जिनमें इंस्ट्रुमेंटेशन नहीं किया गया है. जांच करने के लिए, कॉल स्टैक प्रोफ़ाइल लें, ताकि यह पता चल सके कि कौनसे कोड को एक्ज़ीक्यूट किया गया है. इसके बाद, इस जानकारी का इस्तेमाल करके, ज़्यादा ट्रेस स्लाइस जोड़े जा सकते हैं. इससे आपको ट्रेसिंग को बेहतर बनाने में मदद मिलेगी.
दूसरी स्थिति: मेमोरी लीक और गारबेज कलेक्शन का विश्लेषण करना. मान लें कि सिस्टम ट्रेस से पता चलता है कि मेमोरी के बंटवारे की वजह से, Java हीप मेमोरी में लगातार बढ़ोतरी हो रही है. इससे बार-बार गार्बेज कलेक्शन (GC) ट्रिगर हो रहे हैं. एलॉक किए गए ऑब्जेक्ट को समझने के लिए, हीप प्रोफ़ाइल या हीप डंप लें. इन दोनों तरीकों को एक साथ इस्तेमाल करने से, आपको मेमोरी का इस्तेमाल कम करने के तरीके पता चलते हैं. उदाहरण के लिए, कैश मेमोरी का इस्तेमाल करके, ऐसे ऐलोकेशन को कम किया जा सकता है जिन्हें ऑप्टिमाइज़ किया जा सकता है या जो किसी काम के नहीं हैं. इससे GC को होने से रोका जा सकता है.