Compose ও View মেট্রিক তুলনা করা

Jetpack Compose, UI ডেভেলপমেন্টের গতি বাড়ায় এবং Android ডেভেলপমেন্টকে উন্নত করে। তবে, আগে থেকে থাকা অ্যাপে Compose যোগ করলে, অ্যাপের APK সাইজ, বিল্ড ও রানটাইম পারফর্ম্যান্সের মতো মেট্রিক কীভাবে প্রভাবিত হতে পারে তা বিবেচনা করুন।

APK সাইজ ও বিল্ড টাইম

এই বিভাগে, Sunflower স্যাম্পেল অ্যাপ দেখে APK সাইজ ও বিল্ড টাইমের উপর প্রভাব সম্পর্কে আলোচনা করা হয়েছে—এই অ্যাপটি, ভিউ-ভিত্তিক অ্যাপকে Compose-এ মাইগ্রেট করার ব্যাপারে সেরা পদ্ধতি দেখায়।

APK সাইজ

আপনার প্রোজেক্টে লাইব্রেরি যোগ করলে, এটির APK সাইজ বেড়ে যায়। নিম্নলিখিত ফলাফলগুলি প্রতিটি প্রোজেক্টের ছোট করা রিলিজ APK-এর জন্য, যেখানে রিসোর্স এবং কোড ছোট করা চালু আছে, R8 ফুল মোড ব্যবহার করে এবং APK Analyzer ব্যবহার করে পরিমাপ করা হয়েছে।

শুধু ভিউ মিক্সড ভিউ ও কম্পোজ শুধু কম্পোজ করা
ডাউনলোডের আকার ২,২৫২ কেবি ৩,০৩৪ কেবি ২,৯৬৬ কেবি

Sunflower-এ প্রথমবার Compose যোগ করার সময়, APK সাইজ ২,২৫২ কেবি থেকে বেড়ে ৩,০৩৪ কেবি হয়ে যায়—অর্থাৎ ৭৮২ কেবি বেড়ে যায়। জেনারেট করা APK-তে Views ও Compose-এর মিশ্রণে তৈরি করা UI ছিল। Sunflower-এ অতিরিক্ত ডিপেন্ডেন্সি যোগ করার কারণে এই বৃদ্ধি প্রত্যাশিত।

অন্যদিকে, Sunflower-কে যখন শুধু Compose অ্যাপে মাইগ্রেট করা হয়, তখন APK-এর সাইজ ৩,০৩৪ কেবি থেকে কমে ২,৯৬৬ কেবি হয়ে যায়—৬৮ কেবি কমে যায়। এই কমানোর কারণ হল অব্যবহৃত ভিউ ডিপেন্ডেন্সি সরিয়ে দেওয়া, যেমন AppCompat এবং ConstraintLayout।

Build time

Compose যোগ করলে আপনার অ্যাপের বিল্ড টাইম বেড়ে যায় কারণ Compose কম্পাইলার আপনার অ্যাপে কম্পোজেবল প্রসেস করে। স্ট্যান্ডঅ্যালোন gradle-profiler টুল ব্যবহার করে নিম্নলিখিত ফলাফল পাওয়া গেছে, যা একাধিকবার বিল্ড এক্সিকিউট করে যাতে Sunflower-এর ডিবাগ বিল্ডের সময়সীমার জন্য গড় বিল্ড টাইম পাওয়া যায়:

gradle-profiler --benchmark --project-dir . :app:assembleDebug
শুধু ভিউ মিক্সড ভিউ ও কম্পোজ শুধু কম্পোজ করা
Mean build time ২৯৯.৪৭ মিলিসেকেন্ড ৩৯৯.০৯ ms ৩৪২.১৬ মিলি.সে.

Sunflower-এ প্রথমবার Compose যোগ করার সময়, গড় বিল্ড টাইম ২৯৯ ms থেকে ৩৯৯ ms-এ বেড়ে যায়—১০০ ms বৃদ্ধি। প্রোজেক্টে উল্লেখ করা কম্পোজ কোড ট্রান্সফর্ম করার জন্য কম্পোজ কম্পাইলার অতিরিক্ত টাস্ক পারফর্ম করে বলে এই সময় লাগে।

অন্যদিকে, Sunflower-এর Compose-এ মাইগ্রেশন সম্পূর্ণ হওয়ার পরে, গড় বিল্ড টাইম কমে ৩৪২ মিলিসেকেন্ড হয়েছে, অর্থাৎ ৫৭ মিলিসেকেন্ড কমেছে। এই হ্রাসকে বিভিন্ন কারণের জন্য দায়ী করা যেতে পারে যা সম্মিলিতভাবে বিল্ড টাইম কমিয়ে দেয় যেমন ডেটা বাইন্ডিং সরানো, kapt থেকে KSP ব্যবহার করে এমন ডিপেন্ডেন্সি মাইগ্রেট করা এবং বেশ কয়েকটি ডিপেন্ডেন্সি তাদের লেটেস্ট ভার্সনে আপডেট করা।

সারাংশ

Compose ব্যবহার করলে আপনার অ্যাপের APK সাইজ কার্যকরভাবে বৃদ্ধি পাবে এবং Compose কোডের কম্পাইলেশন প্রসেসের কারণে আপনার অ্যাপের বিল্ড টাইম পারফর্ম্যান্সও বৃদ্ধি পাবে। তবে, এই ট্রেড-অফগুলি Compose-এর সুবিধার সাথে তুলনা করে দেখতে হবে, বিশেষ করে Compose গ্রহণ করার সময় ডেভেলপারের প্রোডাক্টিভিটি বৃদ্ধির ক্ষেত্রে। যেমন, Play Store টিম দেখেছে যে UI লেখার জন্য অনেক কম কোড প্রয়োজন হয়, কখনও কখনও ৫০%পর্যন্ত কম, যার ফলে প্রোডাক্টিভিটি ও কোড ম্যানেজ করার ক্ষমতা বৃদ্ধি পায়।

টিমের জন্য Compose অ্যাডপ্ট করুন লিঙ্কে গিয়ে আপনি আরও কেস স্টাডি পড়তে পারবেন।

রানটাইম পারফর্ম্যান্স

এই বিভাগে Jetpack Compose-এ রানটাইম পারফর্ম্যান্স সম্পর্কিত বিষয় কভার করা হয়, যাতে ভিউ সিস্টেমের পারফর্ম্যান্সের সাথে Jetpack Compose-এর পারফর্ম্যান্সের তুলনা করতে এবং আপনি কীভাবে এটি পরিমাপ করতে পারেন তা বুঝতে সাহায্য করা যায়।

স্মার্ট রিকম্পোজিশন

UI-এর কোনও অংশ ভুল হলে, Compose শুধু সেই অংশটিই আবার কম্পোজ করার চেষ্টা করে যেটি আপডেট করা প্রয়োজন। এই বিষয়ে আরও জানতে কম্পোজেবলের লাইফসাইকেল এবং Jetpack Compose ফেজ সংক্রান্ত ডকুমেন্টেশন দেখুন।

বেসলাইন প্রোফাইল

বেসলাইন প্রোফাইল হল ব্যবহারকারীর সাধারণ অভিজ্ঞতা দ্রুত করার একটি চমৎকার উপায়। আপনার অ্যাপে বেসলাইন প্রোফাইল অন্তর্ভুক্ত করলে, অন্তর্ভুক্ত কোড পাথের জন্য ইন্টারপ্রিটেশন ও জাস্ট-ইন-টাইম (JIT) কম্পাইলেশন স্টেপ এড়িয়ে প্রথমবার লঞ্চ করার সময় থেকেই কোড এক্সিকিউশনের স্পিড প্রায় ৩০% বাড়ানো যেতে পারে।

Jetpack Compose লাইব্রেরিতে নিজস্ব বেসলাইন প্রোফাইল অন্তর্ভুক্ত থাকে এবং আপনি অ্যাপে Compose ব্যবহার করলে অটোমেটিক এইসব অপ্টিমাইজেশন পেয়ে যান। তবে, এইসব অপ্টিমাইজেশন শুধুমাত্র Compose লাইব্রেরির মধ্যে কোড পাথকে প্রভাবিত করে, তাই আমরা সাজেস্ট করি যে আপনি অ্যাপে একটি বেসলাইন প্রোফাইল যোগ করুন যাতে Compose-এর বাইরে কোড পাথ কভার করা যায়।

View সিস্টেমের সাথে তুলনা

ভিউ সিস্টেমের তুলনায় Jetpack Compose-এ অনেক উন্নতি করা হয়েছে। এইসব উন্নতি নিম্নলিখিত বিভাগে বর্ণনা করা হয়েছে।

সবকিছু ভিউকে এক্সটেন্ড করে

স্ক্রিনে ড্র করে এমন প্রতিটি View, যেমন TextView, Button, বা ImageView, সব ব্যবহারের ক্ষেত্রে সহায়তা করার জন্য মেমরি অ্যালোকেশন, এক্সপ্লিসিট স্টেট ট্র্যাকিং এবং বিভিন্ন কলব্যাক প্রয়োজন। এছাড়াও, কাস্টম View-এর মালিককে প্রয়োজন না থাকলে রিড্রয়িং আটকানোর জন্য স্পষ্ট লজিক প্রয়োগ করতে হবে—যেমন, বারবার ডেটা প্রসেসিংয়ের জন্য।

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

এছাড়াও, Compose স্মার্ট রিকম্পোজিশন প্রদান করে, আপনার পরিবর্তন করার প্রয়োজন না হলে আগে আঁকা ফলাফল রিপ্লে করে।

একাধিক লেআউট পাস

প্রথাগত ViewGroups-এর পরিমাপ ও লেআউট API-তে অনেক বেশি এক্সপ্রেসিভনেস থাকে যার ফলে একাধিক লেআউট পাস হওয়ার সম্ভাবনা থাকে। ভিউ হায়ারার্কির নির্দিষ্ট নেস্টেড পয়েন্টে করা হলে, এই একাধিক লেআউট পাস অনেক বেশি কাজ করতে পারে।

Jetpack Compose তার API চুক্তির মাধ্যমে সব লেআউট কম্পোজেবলের জন্য সিঙ্গেল লেআউট পাস এনফোর্স করে। এটি Compose-কে দক্ষতার সাথে গভীর UI ট্রি ম্যানেজ করতে দেয়। একাধিক পরিমাপের প্রয়োজন হলে, Compose-এ ইন্ট্রিনসিক পরিমাপ আছে।

স্টার্টআপ পারফর্ম্যান্স দেখুন

প্রথমবার কোনও নির্দিষ্ট লেআউট দেখানোর সময় ভিউ সিস্টেমকে XML লেআউট ইনফ্লেট করতে হয়। Jetpack Compose-এ এই খরচ সেভ করা হয় কারণ লেআউট Kotlin-এ লেখা হয় এবং আপনার অ্যাপের বাকি অংশের মতো কম্পাইল করা হয়।

Benchmark Compose

Jetpack Compose 1.0-এ, debug এবং release মোডে অ্যাপের পারফর্ম্যান্সের মধ্যে উল্লেখযোগ্য পার্থক্য রয়েছে। প্রতিনিধিত্বমূলক টাইমিংয়ের জন্য, আপনার অ্যাপ প্রোফাইল করার সময় debug-এর পরিবর্তে release বিল্ড সবসময় ব্যবহার করুন।

আপনার Jetpack Compose কোড কেমন পারফর্ম করছে তা চেক করতে, আপনি Jetpack Macrobenchmark লাইব্রেরি ব্যবহার করতে পারেন। Jetpack Compose-এর সাথে এটি কীভাবে ব্যবহার করতে হয় তা জানতে, MacrobenchmarkSample প্রোজেক্ট দেখুন।

Jetpack Compose টিমও Macrobenchmark ব্যবহার করে যাতে কোনও রিগ্রেশন হলে তা ধরা যায়। যেমন, রিগ্রেশন ট্র্যাক করতে লেজি কলামের জন্য বেঞ্চমার্ক এবং এর ড্যাশবোর্ড দেখুন।

Compose প্রোফাইল ইনস্টলেশন

Jetpack Compose একটি আনবান্ডেল করা লাইব্রেরি হওয়ায়, এটি Zygote থেকে কোনও সুবিধা পায় না যা ভিউ সিস্টেমের UI টুলকিট ক্লাস ও ড্রয়েবল প্রিলোড করে। Jetpack Compose 1.0 রিলিজ বিল্ডের জন্য প্রোফাইল ইনস্টলেশন ব্যবহার করে। প্রোফাইল ইনস্টলার অ্যাপকে ইনস্টলেশনের সময় আগে-থেকে-সময় (AOT) কম্পাইল করার জন্য গুরুত্বপূর্ণ কোড নির্দিষ্ট করতে দেয়। Compose-এ প্রোফাইল ইনস্টলেশন সংক্রান্ত নিয়ম থাকে যা Compose অ্যাপে স্টার্টআপের সময় ও জ্যাঙ্ক কমায়।