مقایسه سنجه‌های Compose و View

Jetpack Compose توسعه میانای کاربر را تسریع می‌کند و توسعه Android را بهبود می‌بخشد. بااین‌حال، درنظر بگیرید که چگونه افزودن Compose به یک برنامه موجود می‌تواند بر سنجه‌هایی مانند اندازه APK برنامه، ساخت، و عملکرد زمان اجرا تأثیر بگذارد.

اندازه APK و زمان‌های ساخت

این بخش با بررسی برنامه نمونه Sunflower (برنامه‌ای که روال‌های مطلوب را برای انتقال برنامه مبتنی بر View به Compose نشان می‌دهد) تأثیر بر اندازه APK و زمان ساخت را بررسی می‌کند.

اندازه APK

افزودن کتابخانه‌ها به پروژه اندازه APK آن را افزایش می‌دهد. نتایج زیر برای APK نسخه پخش کوچک‌شده هر پروژه با کوچک کردن کد و منبع فعال‌شده، بااستفاده از حالت کامل R8، و اندازه‌گیری‌شده بااستفاده از تحلیل‌کننده APK است.

فقط بازدیدها ترکیب کردن «نماها» و Compose فقط نوشتن
اندازه بارگیری ۲٬۲۵۲ کیلوبایت ‫۳٬۰۳۴ کیلوبایت ۲۹۶۶ کیلوبایت

وقتی برای اولین‌بار Compose به Sunflower اضافه شد، اندازه APK از ۲۲۵۲ کیلوبایت به ۳۰۳۴ کیلوبایت افزایش یافت—افزایش ۷۸۲ کیلوبایتی. APK تولیدشده شامل ساختار رابط کاربری با ترکیبی از Views و Compose بود. این افزایش قابل‌انتظار است زیرا وابستگی‌های بیشتری به Sunflower اضافه شده است.

برعکس، وقتی Sunflower به برنامه فقط Compose منتقل شد، اندازه APK از ۳۰۳۴ کیلوبایت به ۲۹۶۶ کیلوبایت کاهش یافت—کاهش ۶۸ کیلوبایتی. این کاهش به‌دلیل برداشتن وابستگی‌های View استفاده‌نشده، مثل AppCompat و ConstraintLayout بود.

زمان ساخت

افزودن Compose زمان ساخت برنامه شما را افزایش می‌دهد زیرا کامپایلر Compose ترکیب‌بندی‌ها را در برنامه شما پردازش می‌کند. نتایج زیر بااستفاده از ابزار مستقل gradle-profiler به‌دست آمده است که ساخت را چندین‌بار اجرا می‌کند تا میانگین زمان ساخت برای مدت‌زمان ساخت اشکال‌زدایی Sunflower به‌دست آید:

gradle-profiler --benchmark --project-dir . :app:assembleDebug
فقط بازدیدها ترکیب کردن «نماها» و Compose فقط نوشتن
میانگین زمان ساخت ۲۹۹٫۴۷ میلی‌ثانیه ۳۹۹٫۰۹ میلی‌ثانیه ‫۳۴۲٫۱۶ میلی‌ثانیه

وقتی برای اولین‌بار Compose به Sunflower اضافه شد، میانگین زمان ساخت از ۲۹۹ میلی‌ثانیه به ۳۹۹ میلی‌ثانیه افزایش یافت—افزایش ۱۰۰ میلی‌ثانیه‌ای. این مدت‌زمان به‌دلیل انجام کارهای اضافی توسط کامپایلر Compose برای تبدیل کد Compose تعریف‌شده در پروژه است.

برعکس، وقتی انتقال Sunflower به Compose تکمیل شد، میانگین زمان ساخت به ۳۴۲ میلی‌ثانیه کاهش یافت که کاهشی ۵۷ میلی‌ثانیه‌ای بود. این کاهش را می‌توان به چندین عامل نسبت داد که درمجموع زمان ساخت را کاهش می‌دهند، مانند حذف اتصال داده، انتقال وابستگی‌هایی که از kapt به KSP استفاده می‌کنند، و به‌روزرسانی چندین وابستگی به جدیدترین نسخه‌هایشان.

خلاصه

استفاده از Compose به‌طور مؤثری اندازه APK برنامه‌تان را افزایش می‌دهد و همچنین به‌دلیل فرایند کامپایل کردن کد Compose، عملکرد زمان ساخت برنامه‌تان را افزایش می‌دهد. بااین‌حال، این معاوضه‌ها باید درمقابل مزایای Compose، به‌ویژه درخصوص افزایش بهره‌وری توسعه‌دهنده هنگام استفاده از Compose، سنجیده شوند. برای مثال، تیم «فروشگاه Play» متوجه شد که نوشتن واسط کاربر به کد بسیار کمتری نیاز دارد، گاهی تا ۵۰٪ کمتر، و درنتیجه بهره‌وری و قابلیت نگهداری کد افزایش می‌یابد.

می‌توانید مطالعات موردی بیشتری را در Adopt Compose for Teams بخوانید.

عملکرد زمان اجرا

این بخش موضوعات مربوط به عملکرد زمان اجرا در Jetpack Compose را پوشش می‌دهد تا به درک نحوه مقایسه Jetpack Compose با عملکرد سیستم View و نحوه اندازه‌گیری آن کمک کند.

بازترکیب‌های هوشمند

وقتی بخش‌هایی از میانای کاربر نامعتبر است، Compose سعی می‌کند فقط بخش‌هایی را که نیاز به به‌روزرسانی دارند دوباره ترکیب‌بندی کند. در اسناد چرخه حیات ترکیب‌پذیرها و فازهای Jetpack Compose درباره این موضوع بیشتر بخوانید.

نمایه‌های مبنا

نمایه‌های مبنا روش عالی برای سرعت بخشیدن به مسیرهای کاربر رایج است. گنجاندن Baseline Profile در برنامه می‌تواند سرعت اجرای کد را از اولین راه‌اندازی حدود ۳۰٪ بهبود بخشد، زیرا از مراحل تفسیر و ترجمه درجا (JIT) برای مسیرهای کد گنجانده‌شده اجتناب می‌کند.

کتابخانه Jetpack Compose شامل Baseline Profile خودش است و وقتی از Compose در برنامه‌تان استفاده می‌کنید، به‌طور خودکار این بهینه‌سازی‌ها را دریافت می‌کنید. بااین‌حال، این بهینه‌سازی‌ها فقط بر مسیرهای کد درون کتابخانه Compose تأثیر می‌گذارند، بنابراین توصیه می‌کنیم یک Baseline Profile به برنامه‌تان اضافه کنید تا مسیرهای کد خارج از Compose را پوشش دهد.

مقایسه با سیستم View

Jetpack Compose نسبت‌به سیستم View بهبودهای زیادی دارد. این بهبودها در بخش‌های زیر شرح داده شده است.

همه چیز View را گسترش می‌دهد

هر View که روی صفحه‌نمایش ترسیم می‌شود، مثل TextView، Button، یا ImageView، برای پشتیبانی از همه موارد استفاده به تخصیص حافظه، ردیابی صریح وضعیت، و فراخوانی‌های برگشتی مختلف نیاز دارد. علاوه‌براین، مالک View سفارشی باید منطق صریحی را برای جلوگیری از بازترسیم در مواقعی که ضروری نیست پیاده‌سازی کند—برای مثال، برای پردازش داده‌های تکراری.

Jetpack Compose این مشکل را به چند روش برطرف می‌کند. Compose اشیاء به‌روزرسانی‌شدنی صریح برای نماهای طراحی ندارد. عناصر میانای کاربر توابع ترکیب‌پذیر ساده‌ای هستند که اطلاعات آن‌ها به‌صورت قابل‌بازپخش در ترکیب‌بندی نوشته می‌شود. این کار به کاهش ردیابی وضعیت صریح، تخصیص حافظه، و فراخوانی‌های برگشتی فقط به ترکیب‌پذیرهایی که به ویژگی‌های مذکور نیاز دارند کمک می‌کند، به‌جای اینکه همه افزونه‌های نوع View به آن‌ها نیاز داشته باشند.

علاوه‌براین، Compose بازترکیب‌های هوشمند ارائه می‌دهد، و اگر نیازی به ایجاد تغییرات نداشته باشید، نتیجه قبلاً ترسیم‌شده را بازپخش می‌کند.

چندین گذار چیدمان

ViewGroups سنتی در میان‌اهای اندازه‌گیری و چیدمان خود بیانگری زیادی دارند که آن‌ها را مستعد چندین گذر چیدمان می‌کند. این گذرهای چیدمان چندگانه می‌توانند باعث کار نمایی شوند اگر در نقاط تودرتو خاصی در سلسله مراتب نما انجام شوند.

Jetpack Compose ازطریق قرارداد میانای برنامه‌سازی کاربردی خود، یک گذر طرح‌بندی واحد را برای همه ترکیب‌شدنی‌های طرح‌بندی اعمال می‌کند. این کار به Compose اجازه می‌دهد درخت‌های عمیق میانای کاربر را به‌طور کارآمد مدیریت کند. اگر به چند اندازه‌گیری نیاز باشد، Compose اندازه‌گیری‌های ذاتی دارد.

مشاهده عملکرد راه‌اندازی

سیستم View باید هنگام نمایش یک چیدمان خاص برای اولین‌بار، چیدمان‌های XML را گسترش دهد. این هزینه در Jetpack Compose ذخیره می‌شود زیرا چیدمان‌ها به زبان Kotlin نوشته شده‌اند و مانند بقیه برنامه شما کامپایل می‌شوند.

محک‌زنی Compose

در Jetpack Compose 1.0، تفاوت‌های قابل‌توجهی بین عملکرد برنامه در حالت‌های debug و release وجود دارد. برای زمان‌بندی‌های نماینده، همیشه هنگام نمایه‌سازی برنامه‌تان، از ساخت release به‌جای debug استفاده کنید.

برای بررسی عملکرد کد Jetpack Compose، می‌توانید از کتابخانه Jetpack Macrobenchmark استفاده کنید. برای آشنایی با نحوه استفاده از آن با Jetpack Compose، به پروژه MacrobenchmarkSample مراجعه کنید.

تیم Jetpack Compose نیز از Macrobenchmark برای شناسایی هرگونه پس‌رفتی که ممکن است رخ دهد استفاده می‌کند. برای مثال، معیار ستون تنبل و داشبورد آن را ببینید تا رگرسیون‌ها را ردیابی کنید.

نصب نمایه Compose

ازآنجایی‌که Jetpack Compose یک کتابخانه غیربسته‌ای است، از Zygote که کلاس‌های UI Toolkit و موارد قابل‌ترسیم سیستم View را پیش‌بارگذاری می‌کند، بهره‌مند نمی‌شود. Jetpack Compose 1.0 از نصب نمایه برای ساخت‌های نسخه پخش استفاده می‌کند. نصب‌کننده‌های نمایه به برنامه‌ها اجازه می‌دهند کد بحرانی را برای کامپایل شدن پیش‌از موعد (AOT) در زمان نصب مشخص کنند. Compose قوانین نصب نمایه را ارسال می‌کند که زمان راه‌اندازی و لرزش را در برنامه‌های Compose کاهش می‌دهد.