Android 8.0 ART এর উন্নতি

Android 8.0 রিলিজে Android রানটাইম (ART) উল্লেখযোগ্যভাবে উন্নত করা হয়েছে। নীচের তালিকাটি সংক্ষিপ্তভাবে বর্ণনা করে যে ডিভাইস নির্মাতারা ART-তে আশা করতে পারেন।

সমসাময়িক কম্প্যাক্টিং আবর্জনা সংগ্রাহক

Google I/O-তে ঘোষণা করা হয়েছে, ART-এ Android 8.0-এ একটি নতুন সমবর্তী কমপ্যাক্টিং গারবেজ কালেক্টর (GC) রয়েছে৷ এই সংগ্রাহক প্রতিবার GC রান করার সময় এবং অ্যাপটি চলাকালীন থ্রেড রুট প্রক্রিয়াকরণের জন্য শুধুমাত্র একটি সংক্ষিপ্ত বিরতি দিয়ে হিপটিকে সংকুচিত করে। এখানে এর সুবিধা রয়েছে:

  • GC সর্বদা হিপকে কমপ্যাক্ট করে: Android 7.0 এর তুলনায় গড়ে 32% ছোট হিপের মাপ।
  • কমপ্যাকশন থ্রেড স্থানীয় বাম্প পয়েন্টার বস্তু বরাদ্দ সক্ষম করে: বরাদ্দগুলি Android 7.0 এর তুলনায় 70% দ্রুত।
  • Android 7.0 GC-এর তুলনায় H2 বেঞ্চমার্কের জন্য 85% ছোট বিরতির সময় অফার করে।
  • থামার সময় আর স্তূপের আকারের সাথে স্কেল নয়; অ্যাপ্লিকেশানগুলি জ্যাঙ্ক সম্পর্কে চিন্তা না করেই বড় গাদা ব্যবহার করতে সক্ষম হওয়া উচিত।
  • GC বাস্তবায়নের বিশদ - বাধা পড়ুন:
    • রিড ব্যারিয়ার হল প্রতিটি অবজেক্ট ফিল্ড রিডের জন্য করা অল্প পরিমাণ কাজ।
    • এগুলি কম্পাইলারে অপ্টিমাইজ করা হয়েছে, তবে কিছু ব্যবহারের ক্ষেত্রে গতি কমিয়ে দিতে পারে।

লুপ অপ্টিমাইজেশান

অ্যান্ড্রয়েড 8.0 রিলিজে ART দ্বারা বিভিন্ন ধরণের লুপ অপ্টিমাইজেশান নিযুক্ত করা হয়েছে:

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

লুপ অপ্টিমাইজারটি ART কম্পাইলারের নিজস্ব অপ্টিমাইজেশন পাসে থাকে। বেশিরভাগ লুপ অপ্টিমাইজেশান অন্যত্র অপ্টিমাইজেশন এবং সরলীকরণের অনুরূপ। কিছু অপ্টিমাইজেশানের সাথে চ্যালেঞ্জগুলি দেখা দেয় যা CFG কে স্বাভাবিকের চেয়ে বেশি বিস্তৃত উপায়ে পুনর্লিখন করে, কারণ বেশিরভাগ CFG ইউটিলিটিগুলি (nodes.h দেখুন) একটি CFG তৈরিতে ফোকাস করে, একটি পুনর্লিখন নয়।

শ্রেণী শ্রেণিবিন্যাস বিশ্লেষণ

অ্যান্ড্রয়েড 8.0-এ ART ক্লাস হায়ারার্কি অ্যানালাইসিস (CHA) ব্যবহার করে, একটি কম্পাইলার অপ্টিমাইজেশান যা ভার্চুয়াল কলগুলিকে সরাসরি কলগুলিতে ডিভার্চুয়ালাইজ করে ক্লাস হায়ারার্কি বিশ্লেষণের মাধ্যমে তৈরি করা তথ্যের উপর ভিত্তি করে। ভার্চুয়াল কলগুলি ব্যয়বহুল কারণ সেগুলি একটি vtable লুকআপের চারপাশে প্রয়োগ করা হয় এবং তারা কয়েকটি নির্ভরশীল লোড নেয়৷ এছাড়াও ভার্চুয়াল কল ইনলাইন করা যাবে না।

এখানে সম্পর্কিত উন্নতিগুলির একটি সারসংক্ষেপ রয়েছে:

  • গতিশীল একক-বাস্তবায়ন পদ্ধতির অবস্থা আপডেট করা - ক্লাস লিঙ্ক করার সময় শেষে, যখন vtable পপুলেট করা হয়, ART সুপার ক্লাসের vtable এর সাথে একটি এন্ট্রি-বাই-এন্ট্রি তুলনা করে।
  • কম্পাইলার অপ্টিমাইজেশান - কম্পাইলার একটি পদ্ধতির একক-বাস্তবায়ন তথ্যের সুবিধা নেবে। যদি একটি পদ্ধতি A.foo-এ একক-বাস্তবায়ন ফ্ল্যাগ সেট থাকে, তাহলে কম্পাইলার ভার্চুয়াল কলটিকে একটি সরাসরি কলে ডিভার্চুয়ালাইজ করবে এবং ফলস্বরূপ সরাসরি কলটিকে ইনলাইন করার চেষ্টা করবে।
  • সংকলিত কোড অবৈধকরণ - এছাড়াও ক্লাস লিঙ্ক করার সময় শেষে যখন একক-বাস্তবায়ন তথ্য আপডেট করা হয়, যদি পদ্ধতি A.foo যেটির আগে একক-বাস্তবায়ন ছিল কিন্তু সেই স্থিতি এখন অবৈধ হয়ে গেছে, সমস্ত সংকলিত কোড যা সেই পদ্ধতি A অনুমানের উপর নির্ভর করে। foo-এর একক-বাস্তবায়ন প্রয়োজন তাদের সংকলিত কোড অবৈধ।
  • ডিঅপ্টিমাইজেশন - স্ট্যাকে থাকা লাইভ কম্পাইল করা কোডের জন্য, সঠিকতার গ্যারান্টি দেওয়ার জন্য অবৈধ কম্পাইল করা কোডটিকে ইন্টারপ্রেটার মোডে বাধ্য করার জন্য ডিঅপ্টিমাইজেশন শুরু করা হবে। ডিঅপ্টিমাইজেশনের একটি নতুন মেকানিজম যা সিঙ্ক্রোনাস এবং অ্যাসিঙ্ক্রোনাস ডিঅপ্টিমাইজেশনের একটি হাইব্রিড ব্যবহার করা হবে।

.oat ফাইলে ইনলাইন ক্যাশে

ART এখন ইনলাইন ক্যাশে নিয়োগ করে এবং কল সাইটগুলিকে অপ্টিমাইজ করে যার জন্য যথেষ্ট ডেটা বিদ্যমান। ইনলাইন ক্যাশে বৈশিষ্ট্য প্রোফাইলে অতিরিক্ত রানটাইম তথ্য রেকর্ড করে এবং সময় সংকলনের আগে গতিশীল অপ্টিমাইজেশান যোগ করতে এটি ব্যবহার করে।

ডেক্সলেআউট

ডেক্সলেআউট হল একটি লাইব্রেরি যা অ্যান্ড্রয়েড 8.0-এ প্রবর্তিত হয়েছে ডেক্স ফাইলগুলি বিশ্লেষণ করতে এবং একটি প্রোফাইল অনুসারে সেগুলিকে পুনরায় সাজাতে৷ Dexlayout এর লক্ষ্য ডিভাইসে নিষ্ক্রিয় রক্ষণাবেক্ষণ সংকলনের সময় dex ফাইলের বিভাগগুলিকে পুনরায় সাজাতে রানটাইম প্রোফাইলিং তথ্য ব্যবহার করা। প্রায়শই একসাথে অ্যাক্সেস করা হয় এমন ডেক্স ফাইলের অংশগুলিকে একত্রিত করে, প্রোগ্রামগুলি উন্নত লোকালয় থেকে আরও ভাল মেমরি অ্যাক্সেস প্যাটার্ন থাকতে পারে, র‌্যাম বাঁচায় এবং স্টার্ট আপের সময় ছোট করে।

যেহেতু প্রোফাইল তথ্য বর্তমানে অ্যাপগুলি চালানোর পরেই পাওয়া যায়, তাই নিষ্ক্রিয় রক্ষণাবেক্ষণের সময় dex2oat-এর অন-ডিভাইস সংকলনে dexlayout একত্রিত হয়।

ডেক্স ক্যাশে অপসারণ

অ্যান্ড্রয়েড 7.0 পর্যন্ত, DexCache অবজেক্টের মালিকানাধীন চারটি বড় অ্যারে, ডেক্সফাইলের নির্দিষ্ট উপাদানের সংখ্যার সমানুপাতিক, যথা:

  • স্ট্রিং (ডেক্সফাইল::স্ট্রিংআইডি প্রতি একটি রেফারেন্স),
  • প্রকার (DexFile::TypeId প্রতি একটি রেফারেন্স),
  • পদ্ধতি (একটি নেটিভ পয়েন্টার প্রতি DexFile::MethodId),
  • ক্ষেত্র (DexFile::FieldId প্রতি একটি নেটিভ পয়েন্টার)।

এই অ্যারেগুলি আমরা পূর্বে সমাধান করা বস্তুগুলির দ্রুত পুনরুদ্ধারের জন্য ব্যবহার করা হয়েছিল। অ্যান্ড্রয়েড 8.0 এ, মেথড অ্যারে ব্যতীত সমস্ত অ্যারে সরানো হয়েছে।

দোভাষী কর্মক্ষমতা

"mterp" প্রবর্তনের সাথে অ্যান্ড্রয়েড 7.0 রিলিজে দোভাষীর কার্যকারিতা উল্লেখযোগ্যভাবে উন্নত হয়েছে - অ্যাসেম্বলি ভাষায় লিখিত একটি কোর ফেচ/ডিকোড/ইন্টারপ্রেট মেকানিজম সমন্বিত একটি দোভাষী। Mterp দ্রুত ডালভিক দোভাষীর অনুকরণে তৈরি করা হয়েছে, এবং arm, arm64, x86, x86_64, mips এবং mips64 সমর্থন করে। কম্পিউটেশনাল কোডের জন্য, Art's mterp মোটামুটি ডালভিকের দ্রুত দোভাষীর সাথে তুলনীয়। যাইহোক, কিছু পরিস্থিতিতে এটি উল্লেখযোগ্যভাবে - এবং এমনকি নাটকীয়ভাবে - ধীর হতে পারে:

  1. কর্মক্ষমতা আহ্বান.
  2. স্ট্রিং ম্যানিপুলেশন, এবং ডালভিকের অন্তর্নিহিত হিসাবে স্বীকৃত পদ্ধতির অন্যান্য ভারী ব্যবহারকারী।
  3. উচ্চ স্ট্যাক মেমরি ব্যবহার.

অ্যান্ড্রয়েড 8.0 এই সমস্যার সমাধান করে।

আরও ইনলাইনিং

অ্যান্ড্রয়েড 6.0 থেকে, এআরটি একই ডেক্স ফাইলের মধ্যে যেকোনো কল ইনলাইন করতে পারে, তবে বিভিন্ন ডেক্স ফাইল থেকে শুধুমাত্র পাতার পদ্ধতিতে ইনলাইন করতে পারে। এই সীমাবদ্ধতার দুটি কারণ ছিল:

  1. অন্য ডেক্স ফাইল থেকে ইনলাইন করার জন্য সেই অন্য ডেক্স ফাইলের ডেক্স ক্যাশে ব্যবহার করতে হবে, একই dex ফাইল ইনলাইনিংয়ের বিপরীতে, যা কলারের ডেক্স ক্যাশে পুনরায় ব্যবহার করতে পারে। স্ট্যাটিক কল, স্ট্রিং লোড বা ক্লাস লোডের মতো কয়েকটি নির্দেশের জন্য কম্পাইল করা কোডে ডেক্স ক্যাশে প্রয়োজন।
  2. স্ট্যাক মানচিত্র শুধুমাত্র বর্তমান dex ফাইলের মধ্যে একটি পদ্ধতি সূচক এনকোডিং করছে।

এই সীমাবদ্ধতাগুলি সমাধান করতে, Android 8.0:

  1. কম্পাইল করা কোড থেকে ডেক্স ক্যাশে অ্যাক্সেস সরিয়ে দেয় (এছাড়াও "ডেক্স ক্যাশে অপসারণ" বিভাগটি দেখুন)
  2. স্ট্যাক ম্যাপ এনকোডিং প্রসারিত করে।

সিঙ্ক্রোনাইজেশন উন্নতি

ART টিম MonitorEnter/MonitorExit কোড পাথগুলিকে টিউন করেছে, এবং ARMv8-এ প্রথাগত মেমরি বাধাগুলির উপর আমাদের নির্ভরতা কমিয়েছে, যেখানে সম্ভব সেখানে নতুন (অধিগ্রহণ/মুক্তি) নির্দেশাবলী দিয়ে প্রতিস্থাপন করেছে।

দ্রুত দেশীয় পদ্ধতি

@FastNative এবং @CriticalNative টীকা ব্যবহার করে জাভা নেটিভ ইন্টারফেস (JNI)-তে দ্রুত নেটিভ কল পাওয়া যায়। এই বিল্ট-ইন ART রানটাইম অপ্টিমাইজেশানগুলি JNI ট্রানজিশনের গতি বাড়ায় এবং এখন অবচ্যুত !bang JNI স্বরলিপি প্রতিস্থাপন করে৷ টীকাগুলি অ-নেটিভ পদ্ধতিতে কোন প্রভাব ফেলে না এবং শুধুমাত্র bootclasspath প্ল্যাটফর্ম জাভা ল্যাঙ্গুয়েজ কোডে উপলব্ধ (কোন প্লে স্টোর আপডেট নেই)।

@FastNative টীকা নন-স্ট্যাটিক পদ্ধতি সমর্থন করে। এটি ব্যবহার করুন যদি একটি পদ্ধতি একটি প্যারামিটার বা রিটার্ন মান হিসাবে একটি jobject অ্যাক্সেস করে।

@CriticalNative টীকা নিম্নলিখিত বিধিনিষেধ সহ নেটিভ পদ্ধতিগুলি চালানোর জন্য আরও দ্রুততর উপায় সরবরাহ করে:

  • পদ্ধতিগুলি অবশ্যই স্থির হতে হবে - পরামিতি, রিটার্ন মান, বা একটি অন্তর্নিহিত this জন্য কোনও বস্তু নেই।
  • শুধুমাত্র আদিম প্রকারগুলি দেশীয় পদ্ধতিতে প্রেরণ করা হয়।
  • নেটিভ পদ্ধতিটি তার ফাংশন সংজ্ঞাতে JNIEnv এবং jclass প্যারামিটার ব্যবহার করে না।
  • গতিশীল JNI লিঙ্কিংয়ের উপর নির্ভর না করে পদ্ধতিটি অবশ্যই RegisterNatives এর সাথে নিবন্ধিত হতে হবে।

@FastNative নেটিভ পদ্ধতির কার্যক্ষমতা 3x পর্যন্ত উন্নত করতে পারে এবং @CriticalNative 5x পর্যন্ত। উদাহরণস্বরূপ, একটি Nexus 6P ডিভাইসে একটি JNI রূপান্তর পরিমাপ করা হয়েছে:

জাভা নেটিভ ইন্টারফেস (জেএনআই) আহ্বান কার্যকর করার সময় (ন্যানোসেকেন্ডে)
নিয়মিত JNI 115
!ব্যাং JNI 60
@FastNative 35
@CriticalNative 25