प्रोफ़ाइल के टाइप और हर टाइप कब काम आता है

Android में, कई तरह की परफ़ॉर्मेंस प्रोफ़ाइलें रिकॉर्ड की जा सकती हैं. प्रोफ़ाइल इकट्ठा करने से, आपको इन समस्याओं को डीबग करने में मदद मिलती है: आपका ऐप्लिकेशन कितनी तेज़ी से चलता है, यह कितनी मेमोरी का इस्तेमाल करता है, यह कितनी बैटरी खर्च करता है वगैरह.

इस दस्तावेज़ में, सबसे ज़्यादा काम आने वाली प्रोफ़ाइल के टाइप के बारे में बताया गया है. साथ ही, यह भी बताया गया है कि परफ़ॉर्मेंस से जुड़ी सामान्य समस्याओं को डीबग करने के लिए, हर टाइप का इस्तेमाल कब करना चाहिए.

सिस्टम ट्रेस

सिस्टम ट्रेस का उदाहरण
पहली इमेज.: सिस्टम ट्रेस करने वाले टूल का उदाहरण.

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

ऐप्लिकेशन के हिसाब से, ट्रेस में मौजूद जानकारी कई तरह की हो सकती है. जैसे, लेटेन्सी, जंक, मेमोरी, बैटरी वगैरह.

सिस्टम ट्रेस में, कोड से ट्रिगर होने वाले ये इवेंट शामिल होते हैं. इन्हें सिस्टम या उपयोगकर्ता के हिसाब से तय किया जा सकता है. कोड के ज़रिए ट्रिगर किए जाने वाले इवेंट ऐसे इवेंट होते हैं जिन्हें उपयोगकर्ता फ़ंक्शन कॉल के ज़रिए ट्रिगर कर सकते हैं.

  • ट्रेस स्लाइस: ये आपके कोड में अलग-अलग पॉइंट के बीच का समय दिखाते हैं. इन्हें Trace.beginSection और Trace.endSection एपीआई की मदद से जोड़ा जा सकता है.
  • ट्रेस काउंटर: ये ऐसी संख्यात्मक वैल्यू होती हैं जो मेट्रिक को दिखाती हैं. उदाहरण के लिए, हीप साइज़. इन्हें Trace.setCounter एपीआई की मदद से जोड़ा जा सकता है.

सिस्टम ट्रेस में मेट्रिक भी शामिल होती हैं. इन्हें PerfettoSQL क्वेरी से बनाया जा सकता है. इनका इस्तेमाल विश्लेषण करने या ट्रेस की तुलना करने के लिए किया जा सकता है.

हमारा सुझाव है कि सिस्टम ट्रेस का इस्तेमाल करके, ये काम करें:

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

  • डुप्लीकेट कंप्यूटेशन ढूंढें. ट्रेसिंग से यह पता चल सकता है कि क्या कुछ कैलकुलेशन बार-बार की जा रही हैं. इससे गैर-ज़रूरी कार्रवाइयों का पता चल सकता है.

  • लॉक कंटेंशन की समस्याओं का पता लगाना. थ्रेड की स्थितियों और संसाधनों के ब्लॉक होने के समय को दिखाने वाले स्लाइस की जानकारी की मदद से, यह पता लगाया जा सकता है कि क्या लॉक (जैसे, synchronized ब्लॉक) की वजह से उपयोगकर्ता के सफ़र में देरी हो रही है.

  • अपने ऐप्लिकेशन में मल्टी-थ्रेडिंग को समझें. ट्रेस, कई थ्रेड का व्यू देते हैं. इसमें हर थ्रेड की स्थिति और सिस्टम या आपके ऐप्लिकेशन से जोड़े गए किसी भी ट्रेस स्लाइस को दिखाया जाता है. मल्टी-थ्रेड व्यू से, आपको यह समझने में मदद मिलती है कि कौनसी थ्रेड चालू हैं, कौनसी स्लीपिंग मोड में हैं या वे क्या चला रही हैं और वे कैसे इंटरैक्ट करती हैं.

  • परफ़ॉर्मेंस का जटिल विश्लेषण करना. सिस्टम ट्रेस में मौजूद यूज़र इंटरफ़ेस और अलग-अलग तरह की जानकारी दिखाने की सुविधा की वजह से, परफ़ॉर्मेंस से जुड़ी कई समस्याओं को डीबग करने में मदद मिलती है. जैसे, लेटेन्सी, मेमोरी, और बैटरी खर्च.

सिस्टम ट्रेस में, PerfettoSQL का इस्तेमाल करके क्वेरी करने की सुविधा भी उपलब्ध होती है. इस बेहतरीन सुविधा की मदद से, ये काम किए जा सकते हैं:

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

स्टैक सैंपल प्रोफ़ाइलें

स्टैक सैंपल
प्रोफ़ाइल का उदाहरण
दूसरी इमेज.: स्टैक सैंपल प्रोफ़ाइल का उदाहरण.

स्टैक सैंपल प्रोफ़ाइलें, कोड एक्ज़ीक्यूशन के सैंपल रिकॉर्ड करती हैं. साथ ही, कॉल स्टैक की जानकारी को एक तय दर पर सेव करती हैं. ऐसा तब होता है, जब कोई थ्रेड सीपीयू पर टास्क चला रहा हो. इससे यह जानकारी मिलती है कि कोड के एक्ज़ीक्यूट होने के दौरान क्या हो रहा है.

हमारा सुझाव है कि स्टैक सैंपल का इस्तेमाल इन कामों के लिए करें:

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

हीप डंप

हीप डंप का उदाहरण
तीसरी इमेज.: हीप डंप का उदाहरण.

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

हमारा सुझाव देते हैं कि हीप डंप इकट्ठा करके, ये काम किए जा सकते हैं:

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

हीप प्रोफ़ाइल

हीप प्रोफ़ाइल का उदाहरण
चौथी इमेज.: हीप प्रोफ़ाइल का उदाहरण.

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

हमारा सुझाव है कि इन कामों के लिए, हीप प्रोफ़ाइल का इस्तेमाल करें:

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

प्रोफ़ाइलें मर्ज करना

अक्सर, आपको एक ही प्रोफ़ाइल का इस्तेमाल करके परफ़ॉर्मेंस का विश्लेषण करना होगा. हालांकि, एक से ज़्यादा प्रोफ़ाइल या एक ही मिली-जुली प्रोफ़ाइल से अक्सर ज़्यादा जानकारी मिलती है. इससे उन मुश्किल समस्याओं का पता लगाने में मदद मिलती है जिनका पता सिर्फ़ एक प्रोफ़ाइल से नहीं लगाया जा सकता.

यहां कुछ ऐसे उदाहरण दिए गए हैं जिनमें प्रोफ़ाइलों को एक साथ जोड़ने से फ़ायदा होता है:

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

  • दूसरा उदाहरण: मेमोरी लीक और गारबेज कलेक्शन का विश्लेषण करना. मान लें कि सिस्टम ट्रेस से पता चलता है कि मेमोरी के बंटवारे की वजह से, Java हीप मेमोरी में लगातार बढ़ोतरी हो रही है. इस वजह से, बार-बार गार्बेज कलेक्शन (जीसी) ट्रिगर हो रहे हैं. एलॉक किए गए ऑब्जेक्ट को समझने के लिए, हीप प्रोफ़ाइल या हीप डंप लें. इन दोनों तरीकों को एक साथ इस्तेमाल करने से, आपको मेमोरी का इस्तेमाल कम करने के तरीके पता चलते हैं. उदाहरण के लिए, कैश मेमोरी का इस्तेमाल करके, फ़ालतू या ऑप्टिमाइज़ किए जा सकने वाले असाइनमेंट को कम करने से, GC को होने से रोका जा सकता है.