एंड्रॉइड के प्रदर्शन सुझावों से "एंम्स से बचें जहां आपको केवल आवश्यकताएं हैं" क्यों हटाया गया था?


175

" डेवलपर से बचने के लिए जहां आपको केवल आवश्यकताएं होती हैं" अनुभाग को आधिकारिक डेवलपर दस्तावेज से हटा दिया गया था । (देखें पुराने अनुभाग की सामग्री के लिए Android अधिक एनम का उपयोग क्यों नहीं करता है)

क्यों? क्या एंड्रॉइड वीएम में एक बदलाव हुआ था जिसने टिप को अप्रचलित बना दिया था?


2
संदर्भ के लिए, यहाँ श्रुब्रटी उदाहरण के लिए विघटित बायोटेक है: https://gist.github.com/847418
जोश ली

15
मार्च 2014 तक, निम्न पृष्ठ में अभी भी enums का उपयोग करने के खिलाफ सलाह शामिल है: developer.android.com/training/articles/memory.html#Overhead
ताहिर अख्तर

2
@TahirAkhtar ने कहा, एक साल बाद, आधिकारिक एंड्रॉइड प्रशिक्षण अभी भी कहता है, "आपको एंड्रॉइड पर एनम का उपयोग करने से सख्ती से बचना चाहिए।"
22

1
दिलचस्प है कि एनम से बचने के लिए सिफारिश का नेतृत्व इस 2015 के लेख में एक प्रमुख एंड्रॉइड डेवलपर से किया गया है: medium.com/google-developers/… इसके अलावा: "ध्यान दें कि @IntDef एनोटेशन का उपयोग करते हुए, जो एंड्रॉइड स्टूडियो और ग्रैडल 1.3+ द्वारा समर्थित है।" अपने कोड बिल्ड-टाइम टाइप सुरक्षा (जब लिंट त्रुटियों को सक्षम किया जाता है) देगा, जबकि इंटेबल्स का उपयोग करने के आकार और प्रदर्शन लाभ को बनाए रखेगा। "
tonylo

4
अप्रैल 2018 तक, निम्न पृष्ठ में अब एनम का उपयोग करने के खिलाफ सलाह नहीं है। डेवलपर
रॉबिन डेविस

जवाबों:


157

उस दस्तावेज़ का मूल संस्करण सिर्फ पूर्वाग्रहों का एक समूह था। यह केवल वास्तविक बेंचमार्क द्वारा समर्थित तथ्यों को फिर से लिखने के लिए लिखा गया है, और यह VM अद्यतन होने के कारण अपडेट किया गया है। आप विभिन्न बेंचमार्क पा सकते हैं - प्लस कुछ बेंचमार्क जिसका उपयोग हम कोर लाइब्रेरीज़ को ऑप्टिमाइज़ करने के लिए करते हैं - http://code.google.com/p/l/vikvik/ पर


35
यदि आप अपने SO प्रोफ़ाइल में अपनी साख सूचीबद्ध करते हैं तो यह मदद करेगा। यह मुझे कुछ खुदाई के आसपास ले गया। लेकिन अब जब मैं देख रहा हूं कि आप वीएम टीम पर काम कर रहे हैं, तो मैं आपके जवाब को आधिकारिक जवाब मानूंगा। :)
थिएरी-दिमित्री रॉय

25
Enum class जोड़ने का मतलब यह है कि आपके ऐप में एक अतिरिक्त वर्ग है, इसलिए यह मुफ़्त नहीं है , लेकिन हमें यह मानना ​​होगा कि एक डेवलपर केवल enums जोड़ रहा है जहां वे उपयोगी हैं। केवल एक बहुत बुरा उपयोग जो मैंने एनम के बारे में देखा है वह कुछ सद्भाव कोड में था जहां वे वास्तव में (बिटमास्क और पसंद के लिए) इन्ट्स चाहते थे और "एनम" किसी भी उचित अर्थ में एक एनम नहीं था। यदि आप अपने आप को "ऑर्डिनल ()" बहुत कहते हैं, तो संभवतः यह एक बुरी गंध है जिसका अर्थ है कि आप एक एनम नहीं चाहते हैं। लेकिन यह एक Android विशिष्ट टिप नहीं है, और यह वैसे भी एक बहुत ही दुर्लभ डिजाइन त्रुटि है।
इलियट ह्यूजेस

17
क्या यह दस्तावेज़ पुराना होने के साथ-साथ @ थियरी-दिमित्रिऑय है? विशेष रूप से, आपको एंड्रॉइड पर एनम का उपयोग करने से सख्ती से बचना चाहिए।
जैकब तबक


11
आपके द्वारा दिया गया लिंक मृत है।
टेरी

26

एक अनुमान:

  • हमिंगबर्ड और स्नैपड्रैगन जैसे गिगाहर्ट्ज़ सीपीयू अब आम हैं, और छोटे-कोड वाले छोटे-मेमोरी की आवश्यकताएं जो मूल रूप से दलविक वीएम को विवश करती हैं, अब उतनी सच नहीं हैं।
  • हर शिपिंग डिवाइस JIT (नया 2.2) का उपयोग करता है। एनम का क्लास इनिशलाइज़र तेजी से चलेगा, मानों को जेआईटी-टाइम कॉन्स्टेंट के रूप में माना जा सकता है, और जेआईटी को एनम क्लासेस को सुव्यवस्थित करने के लिए विशेष समर्थन हो सकता है।
  • कोड जो वास्तव में है प्रदर्शन-संवेदनशील है, NDK का उपयोग करता है, जो अभी भी नया था और एंड्रॉइड 1.5 रिलीज़ होने पर अनपॉल किया गया था। 2.3 में NDK देशी गतिविधियों का समर्थन करता है, जो लगभग पूरी तरह से अप्रबंधित खेलों के लिए अनुमति देता है।

इस प्रकार, जीयूआई ऐप की तुलनात्मक रूप से सांसारिक आवश्यकताओं के लिए, अतिरिक्त रनटाइम लागत के विकास के समय के लाभ।


23

इलियट ह्यूज अपने ब्लॉग पर दस्तावेज़ के पुनर्लेखन के बारे में अधिक जानकारी प्रदान करता है: http://elliotth.blogspot.com/2010/09/java-benchmarks.html

पोस्ट के दूसरे भाग में बताया गया है कि प्रदर्शन दस्तावेज़ पर प्रत्येक दावा अब बेंचमार्क के साथ समर्थित है। डॉक्टर के पिछले संस्करणों में स्पष्ट रूप से असत्यापित दावे शामिल थे, जैसे, "दुश्मनी से बचें क्योंकि वे बहुत महंगे हैं।"


बस इस लिंक के साथ इलियट के स्वीकृत जवाब को पूरक करना चाहता था।
जुकर

12

इलियट ह्यूजेस के 2011 के जवाब में कहा गया था कि एनम से बचने का मूल कारण प्रदर्शन कारण था ... जैसा कि "प्रसंस्करण प्रदर्शन" में है। चूंकि यह कारण तथ्य से समर्थित नहीं था, इसलिए इसे आधिकारिक दस्तावेज से हटा दिया गया था।

इसे बाद में जोड़ा गया है क्योंकि एनमर्स पूर्णांक का उपयोग करके मेमोरी में बहुत अधिक डेटा जोड़ते हैं।


2
इसके अलावा Google के लोगों ने IntDefएनोटेशन पेश किया , जो एंड्रॉइड स्टूडियो त्रुटियों और चेतावनी के साथ इंट कॉन्स्टेंट को सुरक्षित रूप से उपयोग करने की अनुमति देता है। blog.shamanland.com/2016/02/int-string-enum.html
ओलेक्सी के।

9

TLDR: Dalvik मेमोरी आवंटन के साथ अच्छा नहीं था और इससे Enumअधिक मेमोरी का उपयोग करता है int। Android लॉलीपॉप ने एआरटी के साथ Dalvik को बदल दिया जो समान सीमाओं से ग्रस्त नहीं है। इस प्रकार यह सिफारिश अब प्रासंगिक नहीं है।

लंबे उत्तर:

वाह! 8 साल, 5 जवाब और बाद में कई टिप्पणियाँ वास्तविक कारण अभी भी संबोधित नहीं किया गया है।

प्री-लॉलीपॉप Android के दिनों में, Dalvik वह प्रक्रिया थी जिसका उपयोग VM करता था। चूंकि उस दौरान उपयोग के लिए छोटी मात्रा में मेमोरी उपलब्ध थी, इसलिए डाल्विक के पास बहुत सारी मेमोरी-बाधाएँ थीं। स्मृति आवंटन के लिए डाल्विक को ढेर पर चलना पड़ा और जगह ढूंढनी पड़ी। ढेर भी समय के साथ खंडित हो जाता। डाल्विक डीफ़्रैग्मेन्ट नहीं कर सकता था, इसलिए यह समय के साथ आवंटित होगा और अंततः अंतरिक्ष से बाहर चला जाएगा।

जहाँ आप केवल स्याही की जरूरत है Enums से बचें

Dalvik दिनों से आता है क्योंकि Enuma intऔर a से बहुत बड़ा है और मेमोरी आवंटन बहुत महंगा है।

आज तेजी से आगे, Dalvik को ART द्वारा बदल दिया गया है। ART किटकैट में बाहर आया और लॉलीपॉप के बाद से डिफ़ॉल्ट है।

ART को मेमोरी से ऑप्टिमाइज़ करने के लिए नहीं बल्कि परफॉर्मेंस के लिए ऑप्टिमाइज़ करने के लिए बनाया गया था। यह आवंटन और संग्रह के लिए भी अनुकूलित है। इसका कारण है कि इसमें बड़ी वस्तुओं के लिए मेमोरी सेट है। सब कुछ एक ही ढेर में डालने के बजाय, और फिर सभी छोटे लोगों के बीच बड़ी वस्तुओं के लिए जगह खोजने के लिए, एआरटी सभी बड़ी वस्तुओं और बिटमैप को एक अलग ढेर में डालता है। और फिर छोटी वस्तुएं अलग-अलग ढेर में चली जाती हैं। साथ ही यह डिफ्रैगमेंट कर सकता है।

एआरटी के बाद, यदि आप Enumएंड्रॉइड का उपयोग करते हैं तो परवाह नहीं करता है और यही कारण है कि सिफारिश अब चली गई है।

यह Google पर Chet Haase से आ रहा है। मैं उसकी Google I / O बात खोजने और पूरे वीडियो देखने की सलाह देता हूं। इसमें Android में बहुत सारी उपयोगी जानकारी और अंतर्दृष्टि है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.