मैं लंबे समय से कोड प्रदर्शन और ट्यूनिंग मापदंडों के बारे में पढ़ रहा हूं। और, एंड्रॉइड प्रोग्राम मेरे फोकस में से एक हैं।
आइए पहले बुनियादी या सबसे महत्वपूर्ण अवधारणाओं पर परिचय दें, जिसमें हमें किसी समाधान तक पहुंचने में मदद मिलती है।
जैसा कि Android डेवलपर ने बताया है
मॉड्यूल स्वतंत्र रूप से निर्मित, परीक्षण और डिबग किया जा सकता है
इसलिए, मॉड्यूल के अपने ग्रेड और निर्भरता हैं । और आप इसे परियोजना में देख सकते हैं Hierarchy Viewer
।
तथ्य की बात के रूप में, मॉड्यूलरीकरण ने रखरखाव के मामलों पर जोर दिया । प्रदर्शन मामलों के विपरीत। मान लीजिए, मॉडर्नाइजेशन का यह महत्वपूर्ण प्रभाव है:
- वंशानुक्रम की गहराई बढ़ाएँ
यहाँ एक आरेख है जिसे मैंने इसे स्पष्ट करने के लिए प्लॉट किया था। जैसा कि आप देख सकते हैं। असतत मॉड्यूल का उपयोग करने के लिए, विधि ए को असतत मॉड्यूल के बिना 2N micro secs
तुलना करने के लिए N micro secs
।
यह सवाल मेरे दिमाग में आता है कि संदर्भित तरीके मायने रखते हैं कि वंशानुक्रम की गहराई से संबंधित क्या है?
इसका उत्तर है: हालांकि मॉडर्नाइजेशन का उपयोग करने से रेफरेंस मेथड्स बढ़ जाता है। लेकिन, यह वास्तव में ऐप के प्रदर्शन को प्रभावित नहीं करता है और मुख्य संभव मुद्दा इनहेरिटेंस की गहराई है , जिसमें ज्यादातर मामलों में इग्नोर किया जाता है ।
मैं जोर देता हूं कि मॉडर्नाइजेशन में रेफरेंस मेथड्स बढ़े हैं, यह प्रत्येक मॉड्यूल ग्रैडल और डिपेंडेंसी के कारण है
एप्लिकेशन मॉड्यलाइज़ेशन कैसे संदर्भित पद्धति की संख्या में इतनी अधिक वृद्धि कर सकता है?
जिन स्थितियों में एपीके एनालाइज़र असर करता है वे महत्वपूर्ण रूप से संदर्भित तरीके हैं
यह भी ध्यान दें कि स्रोत कोड संकलित होने के बाद मिनिफ़िकेशन और कोड सिकुड़ सकता है।
उपरोक्त आधिकारिक बयान के अलावा, मैं एक और शर्त जोड़ना चाहता हूं जिसमें एपीके विश्लेषक का प्रभाव है:
डेवलपर को मॉडर्लाइज़ेशन में कितना अनुभव होता है?
मॉडर्नाइजेशन एक घर जैसा है कि आर्किटेक्चर (डेवलपर) यह परिभाषित करता है कि कहां किचन होना चाहिए और कहां रेस्ट रूम होना चाहिए और कहां WC होना चाहिए।
क्या होगा अगर वास्तुकला WC और रसोई के संयोजन का फैसला करता है? हाँ, यह एक आपदा है।
यह तब हो सकता है, जब डेवलपर बहुत अधिक अनुभवी न हो, लेकिन मॉडर्लाइज़ेशन हो सकता है।
अतिरिक्त जानकारी के लिए जोड़ में ओपी सवालों के जवाब
यहाँ मैं टिप्पणियों में पूछे गए सवालों के जवाब देता हूं
अलग ग्रेडल को संदर्भित विधि गणना में क्यों जोड़ा जाएगा? और अलग निर्भरता के लिए, यदि अंतिम परिणाम एकल एपीके है तो मुझे नहीं लगता कि 'ऐप' में डुप्लिकेट निर्भरताएं और फीचर मॉड्यूल संदर्भित विधि गणना में जोड़ देंगे।
क्योंकि मॉड्यूल का निर्माण, परीक्षण और डिबग किया जा सकता है, तो उनके पास अपने स्वयं के ग्रेड और निर्भरताएं होनी चाहिए।
जबकि मल्टी-मॉड्यूल प्रोजेक्ट का अनुपालन किया जा रहा है, कंपाइलर कई .dex
फाइलें बनाता है जिसमें शामिल हैं:
.dex
कुल-एकीकृत निर्भरता के लिए एक फ़ाइल
- मॉड्यूल
.dex
एस
निर्भरता .dex
फ़ाइल सभी मॉड्यूल ग्रेड के एक एकीकृत है
चलो देखते हैं कि कैसे एक मॉड्यूल ग्रेडल अंतिम संदर्भित Mothods गणना को प्रभावित करता है ?!
एक ही परिणाम के साथ 2 APK
एस हैं, लेकिन संदर्भित तरीकों में अंतर मायने रखता है।
वे दोनों खाली गतिविधियां हैं जिनमें 1.7k
संदर्भित तरीकों की गणना में अंतर है जो उनकी कार्यक्षमता पर बहुत अधिक निर्भर हैं। वे महत्वपूर्ण अंतर उनके मॉड्यूल ग्रेड पर है उनमें से एक को कॉन्फ़िगर किया गया था
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
}
एक और कॉन्फ़िगर किया गया
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.2.0-alpha01'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4'
}
हालाँकि वे सिर्फ खाली गतिविधियाँ हैं लेकिन ग्रैडल में न्यूनतम अंतर के कारण 1.7k
रेफरेंस मेथड काउंट्स में अंतर आया।
और ऐप ग्रैडल है
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation project(path: ':module')
}
प्रमुख चिंता यह है कि Apk विश्लेषक में व्यक्तिगत रूप से संदर्भित विधि गणना के अलावा कुल संदर्भित विधि संख्या से अलग क्यों है?
यह सिर्फ आईडीई फिल्टर है और कुछ नहीं। सुनिश्चित करने के लिए, यदि आप केवल एक .dex
फ़ाइल का चयन करते हैं संदर्भ विधि गणना प्रत्येक पंक्ति के SUM के बराबर है संदर्भित पद्धति मायने रखता है, लेकिन यदि आप .dex
फ़ाइलों का चयन करते हैं, तो आपको SUM और वास्तविक गणना में अंतर दिखाई देगा क्योंकि संदर्भों में समानता के कारण विश्लेषण का चयन किया जाता है उन्हें फ़िल्टर करें।
अपने स्क्रीनशॉट में आपने कई .dex
फ़ाइलों का चयन किया है तो एनालाइज़र फ़िल्टर समानता।
हमारी परियोजना में हम केंद्रीकृत निर्भरता.ग्रेड फ़ाइल का उपयोग कर रहे हैं, इसलिए विभिन्न संस्करण की संभावना नहीं है। तो, क्या आपको लगता है कि अगर हमारे पास एक ही / सटीक निर्भरताएँ हैं और फीचर मॉड्यूल में उनके संस्करण हैं, तो यह संदर्भित विधि की संख्या में वृद्धि करेगा?
सैद्धांतिक रूप से इसे संदर्भित विधि संख्या में वृद्धि नहीं करनी चाहिए । लेकिन , जैसा कि मैंने इसे समझाया, डेवलपर का अनुभव अंतिम परिणाम को अत्यधिक प्रभावित करता है।
टीम एनालाइजर को रिलीज से पहले प्रदर्शन के मुद्दों को जांचना और ठीक करना चाहिए
- रक्षक नियम
- सिकुड़ और छोटा संसाधन
- AndroidManifest.xml
- ढाल सेटिंग्स
अब मैं इसे स्पष्ट करना चाहता हूं कि डेवलपर अनुभव और कोड रखरखाव अंतिम परिणाम को कैसे प्रभावित करता है। EVEN अगर आपका एपीके सेंट्रलाइज्ड डिपेंडेंसी का इस्तेमाल करता है
उपर्युक्त उदाहरण में, मैं 5.1k
संदर्भित तरीकों में वृद्धि कर रहा हूं, यदि मैं केंद्रीयकृत निर्भरता रखता था तो गणना करें !!!!!
यह कैसे संभव है ?
इसका उत्तर है: मैंने परियोजना की निर्देशिका .jar
में एक बेकार और छिपी हुई फ़ाइल को जोड़ा libs
। बस के रूप में आसान के रूप में आप देख सकते हैं मैं अंतिम परिणाम को प्रभावित किया।
जैसा कि आप देख सकते हैं कि डेवलपर अनुभव अंतिम result.as को प्रभावित करता है, व्यावहारिक रूप से यह संभव है कि संदर्भित विधियों को बढ़ाया जाए, हालांकि सैद्धांतिक रूप से नहीं होना चाहिए ।
और जब मैं समांतर संकलन को अक्षम करके केवल 'ऐप' मॉड्यूल संकलित करता हूं तो संदर्भित विधि गणना में कोई अंतर क्यों है? यह कम हो जाना चाहिए क्योंकि केवल 'ऐप' मॉड्यूल की निर्भरता का उपयोग किया गया होगा, है ना?
संकलन का संदर्भित तरीकों से कोई संबंध नहीं है। मायने रखता है कि डेवलपर क्या अनुपालन करना चाहता है।
निष्कर्ष
मैंने मुद्दे के चारों ओर सभी संभावनाओं को कवर किया है। वास्तव में, इसे विभिन्न स्थितियों से उभारा जा सकता है और एक डेवलपर इस दिशानिर्देश का उपयोग करके समस्या को ठीक कर सकता है।
- मुझे आशा है कि आपने पाया कि क्यों संदर्भित तरीके बढ़ाए गए थे और क्यों कुछ मामलों में यह काफी बढ़ सकता है।
- मॉड्यूल में उनके ग्रैडल और डिपेंडेंसीज और मॉडर्नाइजेशन वृद्धि मॉड्यूल हैं। इसलिए, ये विधि संदर्भ।
- मॉडर्लाइज़ेशन वास्तव में ऐप प्रदर्शन को इग्नोर करता है लेकिन यह आपके ऐप के रखरखाव को बहुत बेहतर बनाता है।
- मॉड्यूलरीकरण में डेवलपर का अनुभव भी अंतिम परिणाम को अत्यधिक प्रभावित करता है।
महत्वपूर्ण नोट: लगभग सभी विवरण मेरी जांच और शोध हैं। वास्तव में, त्रुटियां और दोष हो सकते हैं और भविष्य में बहुत अधिक जानकारी जोड़ने के लिए इसे अपडेट किया जाएगा।