অ্যান্ড্রয়েডের পারফরম্যান্স টিপস থেকে কেন "যখন আপনার কেবল ইনটসের প্রয়োজন সেখানে এনামগুলি এড়িয়ে চলুন"?


175

অফিসিয়াল বিকাশকারী ডকুমেন্টেশন থেকে "এনাম এড়িয়ে চলুন যেখানে আপনার কেবল ইনটস দরকার" বিভাগটি সরানো হয়েছিল । (দেখুন পুরানো বিভাগের সামগ্রীর জন্য অ্যান্ড্রয়েড কেন আরও এনাম ব্যবহার করে না )

কেন? অ্যান্ড্রয়েড ভিএম-তে এমন কোনও পরিবর্তন ছিল যা টিপটি অচল করে দিয়েছিল?


2
রেফারেন্সের জন্য, এখানে শুকনো উদাহরণের জন্য পচনশীল বাইটকোডটি রয়েছে: https://gist.github.com/847418
জোশ লি

15
মার্চ ২০১৪ পর্যন্ত, নিম্নলিখিত পৃষ্ঠায় এখনও এনামগুলি ব্যবহারের বিরুদ্ধে পরামর্শ রয়েছে: ডেভেলপার.অ্যান্ড্রয়েড
তাহির আক্তার

2
এক বছর পরে, যেমন তাহির আক্তার বলেছেন, সরকারী অ্যান্ড্রয়েড প্রশিক্ষণ এখনও বলেছে "আপনার অ্যান্ড্রয়েডে এনাম ব্যবহার করা কঠোরভাবে করা উচিত" "
লার্শ

1
: সুপারিশ খেয়াল করা এড়াতে enum একটি সীসা Android বিকাশকারী থেকে এই 2015 প্রবন্ধে আকর্ষণীয় medium.com/google-developers/... এছাড়াও: "লক্ষ্য করুন @IntDef টীকা, যা অ্যান্ড্রয়েড স্টুডিও এবং Gradle 1.3+ দ্বারা সমর্থিত ব্যবহার করে, ইনটি ভেরিয়েবলগুলি ব্যবহারের আকার এবং কার্যকারিতা বেনিফিট ধরে রাখার সময় আপনার কোড বিল্ড-টাইম টাইপ সুরক্ষা (যখন লিন্টের ত্রুটিগুলি সক্ষম করা হবে) দেবে ""
টনিলো

4
এপ্রিল 2018 পর্যন্ত, নিম্নলিখিত পৃষ্ঠায় এনামগুলি ব্যবহারের বিরুদ্ধে আর পরামর্শ নেই। বিকাশকারী.অ্যান্ড্রয়েড
রবিন ডেভিস

উত্তর:


157

এই দস্তাবেজের মূল সংস্করণটি ছিল কুসংস্কারের একগুচ্ছ। এটি কেবল সত্যিকারের মানদণ্ড দ্বারা ব্যাক আপ করা তথ্যাদি ধারণ করতে পুনরায় লেখা হয়েছিল এবং ভিএম আপডেট হওয়ার সাথে সাথে এটি আপডেট হয়। আপনি বিভিন্ন মানদণ্ডগুলি খুঁজে পেতে পারেন - সাথে সাথে আমরা মূল লাইব্রেরিগুলিকে অনুকূলকরণের জন্য ব্যবহার করি এমন কিছু মানদণ্ড - http://code.google.com/p/dalvik/ এ


35
আপনি যদি আপনার এসও প্রোফাইলে আপনার শংসাপত্রগুলি তালিকাভুক্ত করেন তবে এটি সহায়তা করবে। আমাকে কিছুটা খনন করে নিল। তবে এখন আমি দেখতে পেয়েছি যে আপনি ভিএম টিমে কাজ করছেন বলে মনে হচ্ছে, আমি আপনার উত্তরটিকে অফিসিয়াল উত্তর হিসাবে গ্রহণ করব। :)
থিয়েরি-দিমিত্রি রায়

25
এনাম ক্লাস যুক্ত করার অর্থ অবশ্যই আপনার অ্যাপ্লিকেশনটিতে একটি অতিরিক্ত শ্রেণি রয়েছে, সুতরাং এটি নিখরচায় নয় , তবে আমাদের ধরে নিতে হবে যে কোনও বিকাশকারী কেবল এনামগুলিকেই যুক্ত করছে যেখানে তারা দরকারী। আমি কেবলমাত্র এনামগুলিকেই খারাপ ব্যবহারটি এমন কিছু সামঞ্জস্যের কোডে দেখছিলাম যেখানে তারা সত্যই ইনটগুলি চেয়েছিল (বিটমাস্ক এবং এই জাতীয় জন্য) এবং "এনাম" কোনও যুক্তিসঙ্গত অর্থে এনাম ছিল না। যদি আপনি নিজেকে "অর্ডিনাল ()" প্রচুর পরিমাণে কল করে দেখতে পান তবে এটি সম্ভবত একটি দুর্গন্ধযুক্ত কারণ আপনি কোনও এনাম চান না। তবে এটি অ্যান্ড্রয়েড-নির্দিষ্ট টিপ নয় এবং এটি যাইহোক সত্যিই বিরল ডিজাইনের ত্রুটি।
এলিয়ট হিউজেস

17
এই দস্তাবেজটিরও কি পুরানো @ থিয়েরি-দিমিত্রিওয়? বিশেষত, আপনার অ্যান্ড্রয়েডে এনাম ব্যবহার করা কঠোরভাবে এড়ানো উচিত।
জ্যাকব তাবাক


11
আপনার দেওয়া লিঙ্কটি মারা গেছে।
টেরি

26

একটি অনুমান:

  • হামিংবার্ড এবং স্ন্যাপড্রাগন এর মতো গিগা হার্টস সিপিইউ এখন প্রচলিত এবং মূলত ডালভিক ভিএমকে বাধা দেয় এমন ছোট-কোডের স্মৃতি-মেমরির প্রয়োজনীয়তা আর সত্য নয়।
  • প্রতিটি শিপিং ডিভাইসটি জেআইটি (নতুন থেকে ২.২) ব্যবহার করে। এনামের ক্লাস ইনিশিয়ালজার দ্রুত চলবে, মানগুলি জেআইটি-টাইম কনস্ট্যান্ট হিসাবে বিবেচিত হতে পারে, এবং এনআইএম ক্লাসগুলি সুবিন্যস্ত করার জন্য জেআইটির পক্ষে বিশেষ সমর্থন থাকতে পারে।
  • কোডটি যা সত্যই পারফরম্যান্স-সংবেদনশীল তা এনডিকে ব্যবহার করে, যা অ্যানড্রয়েড 1.5 প্রকাশের সময় এখনও নতুন এবং অপরিবর্তিত ছিল। ২.৩-এ এনডিকে দেশীয় ক্রিয়াকলাপগুলিকে সমর্থন করে, যা সম্পূর্ণ-অব্যবস্থাপনাহীন গেমগুলির জন্য মঞ্জুরি দেয়।

সুতরাং, একটি জিইউআই অ্যাপ্লিকেশনের তুলনামূলকভাবে জাগ্রত প্রয়োজনীয়তার জন্য, এনামগুলির বিকাশ-সময়ের সুবিধাগুলি অতিরিক্ত রানটাইম ব্যয়ের চেয়ে অনেক বেশি।


23

এলিয়ট হিউজেস তার ব্লগে ডকুমেন্টেশন পুনর্লিখন সম্পর্কে আরও বিশদ সরবরাহ করে: http://elliotth.blogspot.com/2010/09/java-benchmark.html

পোস্টের দ্বিতীয়ার্ধে ব্যাখ্যা করা হয়েছে যে পারফরম্যান্স ডকের প্রতিটি দাবী এখন বেঞ্চমার্কের সাথে ব্যাক আপযুক্ত। ডকটির পূর্ববর্তী সংস্করণগুলিতে স্পষ্টত যাচাইকৃত দাবী রয়েছে, যেমন "এনামগুলি এড়িয়ে চলুন কারণ সেগুলি খুব ব্যয়বহুল।"


এই লিঙ্কটি দিয়ে ইলিয়টের গৃহীত উত্তরটি কেবলমাত্র পরিপূরক করতে চেয়েছিলেন।
jkooker

12

এলিয়ট হিউগসের ২০১১ সালের উত্তর বলেছিল যে এনামকে এড়ানোর মূল কারণটি ছিল "প্রক্রিয়াজাতকরণ কর্মক্ষমতা" হিসাবে performance যেহেতু এই কারণটি সত্য দ্বারা সমর্থন করা হয়নি, এটি সরকারী দস্তাবেজ থেকে সরানো হয়েছে।

এটি পরে যুক্ত করা হয়েছে কারণ এনামগুলি পূর্ণসংখ্যার ব্যবহারের চেয়ে মেমরিতে অনেক বেশি ডেটা যুক্ত করে।


2
এছাড়াও গুগল ছেলেরা IntDefএনোটেশনগুলি প্রবর্তন করেছে , যা অ্যান্ড্রয়েড স্টুডিও ত্রুটি এবং সতর্কতা সহ নিরাপদে ইন্টেনস্ট্যান্ট ব্যবহার করতে দেয়। blog.shamanland.com/2016/02/int-string-enum.html
কে।

9

টিএলডিআর: ডালভিক মেমরি বরাদ্দের সাথে ভাল ছিল না এবং এর Enumচেয়ে বেশি মেমরি ব্যবহার করে int। অ্যান্ড্রয়েড ললিপপ ডালভিককে আরটি দিয়ে প্রতিস্থাপন করেছে যা একই সীমাবদ্ধতায় ভুগছে না। সুতরাং এই সুপারিশ আর প্রাসঙ্গিক নয়।

দীর্ঘ উত্তর:

কি দারুন! 8 বছর, 5 টি উত্তর এবং অনেক মন্তব্য পরেও আসল কারণটি এখনও সম্বোধন করা হয়নি।

প্রি-ললিপপ অ্যান্ড্রয়েডের দিনগুলিতে, ডালভিক ছিলেন ভিএম ব্যবহৃত প্রক্রিয়া। সেই সময়ে অ্যাপ্লিকেশনগুলির জন্য অল্প পরিমাণে মেমরি উপলব্ধ ছিল, ডালভিকের প্রচুর স্মৃতি-বাধা ছিল। স্মৃতি বরাদ্দের জন্য ডালভিককে গাদা হাঁটা এবং জায়গা খুঁজে বের করতে হয়েছিল। গাদা এছাড়াও সময়ের সাথে খণ্ডিত হয়ে যেত। ডালভিক ডিফ্র্যাগমেন্ট করতে পারেনি, তাই এটি সময়ের সাথে সাথে বরাদ্দ দেয় এবং শেষ পর্যন্ত স্থানের বাইরে চলে যায়।

এনামগুলি এড়িয়ে চলুন যেখানে আপনার কেবল ইনট প্রয়োজন

Dalvik দিন থেকে আসে কারণ একটি Enumএকটি তুলনায় অনেক বড় intএবং মেমরি বরাদ্দ খুব ব্যয়বহুল ছিল।

ফাস্ট-ফরোয়ার্ড, আজ ডালভিককে এআরটি দ্বারা প্রতিস্থাপন করা হয়েছে। এআরটি কিটকেটে এসেছিল এবং ললিপপ থেকে এটি ডিফল্ট।

এআরটি গ্রাউন্ড থেকে মেমরির জন্য অপ্টিমাইজ করতে নয় পারফরম্যান্সের জন্য অনুকূলিত করা হয়েছিল। এটি বরাদ্দ এবং সংগ্রহের জন্যও অনুকূলিত। কারণ এটি বড় বস্তুর জন্য মেমরি আলাদা করা আছে। সবকিছুকে একই স্তূপে রাখার পরিবর্তে এবং তারপরে সমস্ত ক্ষুদ্রের মাঝে বড় বড় বস্তুর জন্য জায়গা সন্ধান করার পরিবর্তে এআরটি সমস্ত বৃহত অবজেক্ট এবং বিটম্যাপকে একটি পৃথক স্তূপে রাখে। এবং তারপরে ছোট ছোট বস্তু পৃথক স্তূপে যায়। এছাড়াও এটি ডিফ্র্যাগমেন্ট করতে পারে।

এআরটি-র পরে, আপনি যদি Enumঅ্যান্ড্রয়েড ব্যবহার করেন তবে সেটির কোনও যত্ন নেই এবং এই কারণেই এখন সুপারিশটি চলে গেছে।

এটি গুগলে চেট হােস থেকে আসছে। আমি তার গুগল আই / ও কথা বলে এবং পুরো ভিডিওটি দেখার জন্য পরামর্শ দিই। এতে অ্যান্ড্রয়েডে প্রচুর দরকারী তথ্য এবং অন্তর্দৃষ্টি রয়েছে।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.