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

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

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

এই বিভাগটি APK সাইজ এবং বিল্ড টাইমের উপর প্রভাব সম্পর্কে আলোচনা করে। Sunflower স্যাম্পেল অ্যাপ—একটি অ্যাপ যা ভিউ-ভিত্তিক অ্যাপকে 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
শুধু দেখার জন্য মিক্সড ভিউ ও কম্পোজ শুধু কম্পোজ করা
গড় বিল্ড টাইম ২৯৯.৪৭ মিলিসেকেন্ড ৩৯৯.০৯ ms ৩৪২.১৬ মিলি.সে.

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

অন্যদিকে, 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 স্মার্ট রিকম্পোজিশন প্রদান করে, আপনি পরিবর্তন করতে না চাইলে আগে আঁকা ফলাফল রিপ্লে করে।

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

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

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

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

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

Benchmark Compose

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

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

এছাড়াও, Jetpack Compose টিম Macrobenchmark ব্যবহার করে রিগ্রেশন ট্র্যাক করে এবং রিলিজ জুড়ে ভিউয়ের পারফর্ম্যান্স যাচাই করে। ওপেন-সোর্স Pokedex অ্যাপে Compose ও Views-এর তুলনা করে বিস্তারিত স্টার্টআপ ও স্ক্রল বেঞ্চমার্কের জন্য, হিরো বেঞ্চমার্ক দেখুন।

কম্পোজ প্রোফাইল ইনস্টলেশন

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