लिखें और मेट्रिक देखें की तुलना करें

Jetpack Compose, यूज़र इंटरफ़ेस (यूआई) डेवलपमेंट को तेज़ करता है और Android डेवलपमेंट को बेहतर बनाता है. हालांकि, इस बात का ध्यान रखें कि किसी मौजूदा ऐप्लिकेशन में Compose जोड़ने से, ऐप्लिकेशन के APK साइज़, बिल्ड, और रनटाइम की परफ़ॉर्मेंस जैसी मेट्रिक पर असर पड़ सकता है.

APK का साइज़ और बिल्ड टाइम

इस सेक्शन में, APK के साइज़ और बिल्ड टाइम पर पड़ने वाले असर के बारे में बताया गया है. इसके लिए, सैंपल के तौर पर मिले ऐप्लिकेशन Sunflower का इस्तेमाल किया गया है. यह ऐप्लिकेशन, व्यू-आधारित ऐप्लिकेशन को Compose पर माइग्रेट करने के सबसे सही तरीके दिखाता है.

APK का साइज़

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

सिर्फ़ देखने के लिए व्यू और Compose को एक साथ इस्तेमाल करना सिर्फ़ कंपोज़ करने की सुविधा
डाउनलोड आकार 2,252 केबी 3,034 केबी 2,966 केबी

Sunflower में पहली बार Compose जोड़ने पर, APK का साइज़ 2,252 केबी से बढ़कर 3,034 केबी हो गया. इसमें 782 केबी की बढ़ोतरी हुई. जनरेट किए गए APK में, व्यू और Compose को मिलाकर बनाया गया यूज़र इंटरफ़ेस (यूआई) शामिल था. यह बढ़ोतरी इसलिए हुई है, क्योंकि Sunflower में अतिरिक्त डिपेंडेंसी जोड़ी गई हैं.

इसके उलट, जब Sunflower को सिर्फ़ Compose वाले ऐप्लिकेशन पर माइग्रेट किया गया, तो APK का साइज़ 3,034 केबी से घटकर 2,966 केबी हो गया. यानी, 68 केबी की कमी आई. यह कमी, इस्तेमाल न की गई व्यू डिपेंडेंसी को हटाने की वजह से हुई. जैसे, AppCompat और ConstraintLayout.

बिल्ड प्रोसेस में लगने वाला समय

Compose को जोड़ने से, आपके ऐप्लिकेशन को बिल्ड करने में लगने वाला समय बढ़ जाता है. ऐसा इसलिए होता है, क्योंकि Compose कंपाइलर आपके ऐप्लिकेशन में कंपोज़ेबल को प्रोसेस करता है. यहां दिए गए नतीजे, स्टैंडअलोन gradle-profiler टूल का इस्तेमाल करके मिले हैं. यह टूल, बिल्ड को कई बार चलाता है, ताकि Sunflower के डीबग बिल्ड की अवधि के लिए, बिल्ड में लगने वाले औसत समय का पता लगाया जा सके:

gradle-profiler --benchmark --project-dir . :app:assembleDebug
सिर्फ़ देखने के लिए व्यू और Compose को एक साथ इस्तेमाल करना सिर्फ़ कंपोज़ करने की सुविधा
बिल्ड प्रोसेस में लगने वाला औसत समय 299.47 मि॰से॰ 399.09 मि॰से॰ 342.16 मि॰से॰

Sunflower में पहली बार Compose जोड़ने पर, बिल्ड टाइम का औसत 299 मिलीसेकंड से बढ़कर 399 मिलीसेकंड हो गया. यानी, 100 मिलीसेकंड की बढ़ोतरी हुई. इसकी वजह यह है कि Compose कंपाइलर, प्रोजेक्ट में तय किए गए Compose कोड को बदलने के लिए अतिरिक्त टास्क करता है.

इसके उलट, Sunflower को Compose पर माइग्रेट करने के बाद, बिल्ड टाइम का औसत घटकर 342 मिलीसेकंड हो गया. इसमें 57 मिलीसेकंड की कमी आई. इस कमी की कई वजहें हो सकती हैं. जैसे, डेटा बाइंडिंग को हटाना, kapt का इस्तेमाल करने वाली डिपेंडेंसी को केएसपी पर माइग्रेट करना, और कई डिपेंडेंसी को उनके नए वर्शन पर अपडेट करना.

खास जानकारी

Compose का इस्तेमाल करने से, आपके ऐप्लिकेशन के APK का साइज़ बढ़ जाएगा. साथ ही, Compose कोड को कंपाइल करने की प्रोसेस की वजह से, आपके ऐप्लिकेशन को बिल्ड करने में लगने वाला समय भी बढ़ जाएगा. हालांकि, इन नुकसानों की तुलना Compose के फ़ायदों से की जानी चाहिए. खास तौर पर, Compose को अपनाने पर डेवलपर की प्रॉडक्टिविटी में होने वाली बढ़ोतरी से. उदाहरण के लिए, Play Store की टीम को पता चला कि यूज़र इंटरफ़ेस (यूआई) लिखने के लिए, बहुत कम कोड की ज़रूरत होती है. कभी-कभी तो 50% तक कम कोड की ज़रूरत होती है. इससे, कोड की प्रोडक्टिविटी और उसे मैनेज करने की क्षमता बढ़ती है.

टीम के लिए Compose को अपनाएं में जाकर, ज़्यादा केस स्टडी पढ़ी जा सकती हैं.

रनटाइम परफ़ॉर्मेंस

इस सेक्शन में, Jetpack Compose में रनटाइम परफ़ॉर्मेंस से जुड़े विषयों के बारे में बताया गया है. इससे यह समझने में मदद मिलती है कि Jetpack Compose की तुलना में व्यू सिस्टम की परफ़ॉर्मेंस कैसी है और इसे कैसे मेज़र किया जा सकता है.

स्मार्ट रीकंपोज़िशन

जब यूज़र इंटरफ़ेस (यूआई) के कुछ हिस्से अमान्य होते हैं, तो Compose सिर्फ़ उन हिस्सों को फिर से कंपोज़ करने की कोशिश करता है जिन्हें अपडेट करने की ज़रूरत होती है. इसके बारे में ज़्यादा जानने के लिए, कंपोज़ेबल की लाइफ़साइकल और Jetpack Compose के फ़ेज़ दस्तावेज़ पढ़ें.

बेसलाइन प्रोफ़ाइलें

बेसलाइन प्रोफ़ाइलें, उपयोगकर्ता की सामान्य गतिविधियों को तेज़ी से पूरा करने का एक बेहतरीन तरीका है. अपने ऐप्लिकेशन में Baseline Profile शामिल करने से, कोड एक्ज़ीक्यूशन की स्पीड को करीब 30% तक बढ़ाया जा सकता है. इसके लिए, ऐप्लिकेशन को पहली बार लॉन्च करने पर, शामिल किए गए कोड पाथ के लिए इंटरप्रिटेशन और जस्ट-इन-टाइम (जेआईटी) कंपाइलेशन के चरणों को छोड़ना होगा.

Jetpack Compose लाइब्रेरी में, इसकी अपनी बेसलाइन प्रोफ़ाइल शामिल होती है. अपने ऐप्लिकेशन में Compose का इस्तेमाल करने पर, आपको ये ऑप्टिमाइज़ेशन अपने-आप मिल जाते हैं. हालांकि, ये ऑप्टिमाइज़ेशन सिर्फ़ Compose लाइब्रेरी में मौजूद कोड पाथ पर असर डालते हैं. इसलिए, हमारा सुझाव है कि आप अपने ऐप्लिकेशन में बेसलाइन प्रोफ़ाइल जोड़ें, ताकि Compose के बाहर मौजूद कोड पाथ को कवर किया जा सके.

व्यू सिस्टम के साथ तुलना

Jetpack Compose में व्यू सिस्टम के मुकाबले कई सुधार किए गए हैं. इन सुधारों के बारे में, नीचे दिए गए सेक्शन में बताया गया है.

सभी क्लास, View क्लास को एक्सटेंड करती हैं

स्क्रीन पर दिखने वाले हर View को मेमोरी के बंटवारे, साफ़ तौर पर स्टेट ट्रैकिंग, और अलग-अलग कॉलबैक की ज़रूरत होती है, ताकि इस्तेमाल के सभी उदाहरणों को सपोर्ट किया जा सके. जैसे, TextView, Button या ImageView. इसके अलावा, कस्टम View के मालिक को साफ़ तौर पर लॉजिक लागू करना होगा, ताकि ज़रूरत न होने पर फिर से ड्रॉइंग न हो. उदाहरण के लिए, बार-बार डेटा प्रोसेस करने के लिए.

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

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

एक से ज़्यादा लेआउट पास

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

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

स्टार्टअप की परफ़ॉर्मेंस देखना

किसी लेआउट को पहली बार दिखाने के लिए, व्यू सिस्टम को एक्सएमएल लेआउट को इनफ़्लेट करना पड़ता है. Jetpack Compose में यह लागत बच जाती है, क्योंकि लेआउट Kotlin में लिखे जाते हैं और आपके ऐप्लिकेशन के बाकी हिस्सों की तरह ही कंपाइल किए जाते हैं.

Compose की परफ़ॉर्मेंस की जांच करना

Jetpack Compose में, debug और release मोड में किसी ऐप्लिकेशन की परफ़ॉर्मेंस में काफ़ी अंतर होता है. अपने ऐप्लिकेशन की प्रोफ़ाइल बनाते समय, सही समय की जानकारी पाने के लिए debug के बजाय हमेशा release बिल्ड का इस्तेमाल करें.

Jetpack Compose कोड की परफ़ॉर्मेंस देखने के लिए, Jetpack Macrobenchmark लाइब्रेरी का इस्तेमाल किया जा सकता है. Jetpack Compose के साथ इसका इस्तेमाल करने का तरीका जानने के लिए, MacrobenchmarkSample प्रोजेक्ट देखें.

Jetpack Compose की टीम, Macrobenchmark का इस्तेमाल करके, रिग्रेशन को ट्रैक करती है. साथ ही, हर रिलीज़ में व्यू के हिसाब से परफ़ॉर्मेंस की पुष्टि करती है. ओपन सोर्स Pokedex ऐप्लिकेशन पर, Compose और व्यू की तुलना करने वाले स्टार्टअप और स्क्रोल बेंचमार्क के बारे में ज़्यादा जानने के लिए, हीरो बेंचमार्क देखें.

Compose प्रोफ़ाइल इंस्टॉलेशन

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