التحسين الموجه بالملفات التعريفية (Profile-Guided Optimization) لبدء تشغيل تطبيقات Android
لقد قمنا بتقليل وقت بدء التشغيل البارد (cold start) لتطبيق Android الخاص بنا من 1.2 ثانية إلى 380 مللي ثانية.
تعمل معظم التطبيقات في أبطأ وضع تجميع (compilation mode) خلال التشغيل الأول. يستخدم Android وضع "التفسير فقط" (interpret-only) عندما يقوم المستخدم بتثبيت تطبيقك لأول مرة، مما يجعل بدء التشغيل بطيئًا. لا يقوم النظام بتحسين الكود إلا أثناء وقت الخمول لاحقًا.
يمكنك إصلاح ذلك باستخدام مسار عمل مكون من ثلاث خطوات.
إنشاء Baseline Profiles تُخبر الـ Baseline Profiles النظام بالـ classes التي يجب تجميعها وقت التثبيت. استخدم Macrobenchmark لإنشاء هذه الملفات في مسار CI الخاص بك. غطت ملفاتنا التعريفية 12% من الـ methods ولكنها تولت 94% من وقت بدء التشغيل.
تفعيل إعادة ترتيب تخطيط DEX هذا عبارة عن سطر واحد في ملف Gradle properties الخاص بك. يخبر R8 بتجميع الـ startup classes معًا في ملف DEX الخاص بك. يقلل هذا من أخطاء الصفحات (page faults) بنسبة تتراوح بين 30% إلى 50%. عندما تظل الـ classes معًا، يقوم النظام بتحميل بيانات أقل غير ضرورية من القرص.
استخدام Cloud Profiles يقوم Google Play بجمع الملفات التعريفية من المستخدمين وإرسالها إلى عمليات التثبيت الجديدة، مما يضاعف مكاسب السرعة لديك.
نتائج اختباراتنا:
- بدون ملف تعريف: 1,204 مللي ثانية لبدء التشغيل البارد
- Baseline Profile فقط: 620 مللي ثانية لبدء التشغيل البارد
- Baseline + إعادة ترتيب DEX: 445 مللي ثانية لبدء التشغيل البارد
- Baseline + إعادة ترتيب DEX + Cloud: 380 مللي ثانية لبدء التشغيل البارد
نصائح مهمة لسير عملك:
- قم بإنشاء الملفات التعريفية في CI مع كل إصدار. الملفات التعريفية القديمة تسبب فقدانًا في الأداء.
- أعد إنشاء الملفات التعريفية بعد تشغيل R8، حيث يقوم R8 بتغيير هيكل الكود الخاص بك.
- استخدم وضع التجميع "Partial" في Macrobenchmark. وضع "Full" يعطي نتائج وهمية لا تعكس تجارب المستخدمين الحقيقية.
- اختبر على إصدارات Android مختلفة. تختلف مكاسب الأداء بين مستويات API القديمة والجديدة.
قم بتكديس هذه الطبقات لبناء تطبيقات أسرع.
المصدر: https://dev.to/software_mvp-factory/profile-guided-optimization-for-android-app-startup-2i7a