การทำ Profile-Guided Optimization สำหรับการเริ่มต้นทำงานของ Android App
เราลดเวลา Cold Start ของ Android จาก 1.2 วินาที เหลือเพียง 380 มิลลิวินาที
แอปส่วนใหญ่มักจะทำงานในโหมดการคอมไพล์ (compilation mode) ที่ช้าที่สุดในการเปิดใช้งานครั้งแรก โดย Android จะใช้โหมด "interpret-only" เมื่อผู้ใช้ติดตั้งแอปของคุณเป็นครั้งแรก ซึ่งทำให้การเริ่มต้นทำงาน (startup) ช้าลง ระบบจะทำการปรับแต่งโค้ด (optimize) ก็ต่อเมื่อเครื่องอยู่ในช่วงเวลาว่าง (idle time) ในภายหลังเท่านั้น
คุณสามารถแก้ไขปัญหานี้ได้ด้วยกระบวนการ 3 ขั้นตอน
สร้าง Baseline Profiles Baseline Profiles จะบอกระบบว่าควรคอมไพล์คลาส (classes) ใดบ้างในขณะติดตั้ง ให้ใช้ Macrobenchmark เพื่อสร้างสิ่งเหล่านี้ใน CI pipeline ของคุณ โปรไฟล์ของเราครอบคลุมเพียง 12% ของเมธอด (methods) แต่สามารถจัดการเวลาในการเริ่มต้นทำงานได้ถึง 94%
เปิดใช้งาน DEX Layout Reordering นี่เป็นเพียงการเพิ่มโค้ดบรรทัดเดียวใน Gradle properties ของคุณ ซึ่งจะบอกให้ R8 จัดกลุ่มคลาสที่ใช้ในการเริ่มต้นทำงานให้อยู่รวมกันในไฟล์ DEX วิธีนี้จะช่วยลด page faults ได้ 30% ถึง 50% เพราะเมื่อคลาสอยู่รวมกัน ระบบจะโหลดข้อมูลที่ไม่จำเป็นจากดิสก์น้อยลง
ใช้ Cloud Profiles Google Play จะรวบรวมโปรไฟล์จากผู้ใช้งานและส่งต่อไปยังการติดตั้งใหม่ๆ ซึ่งจะช่วยเพิ่มประสิทธิภาพความเร็วของคุณให้ทวีคูณยิ่งขึ้น
ผลลัพธ์จากการทดสอบของเรา:
- ไม่มีโปรไฟล์: Cold start 1,204 มิลลิวินาที
- ใช้เฉพาะ Baseline Profile: Cold start 620 มิลลิวินาที
- Baseline + DEX reorder: Cold start 445 มิลลิวินาที
- Baseline + DEX reorder + Cloud: Cold start 380 มิลลิวินาที
เคล็ดลับสำคัญสำหรับเวิร์กโฟลว์ของคุณ:
- สร้างโปรไฟล์ใน CI สำหรับทุกการปล่อยเวอร์ชัน (release) เพราะโปรไฟล์ที่ล้าสมัยจะทำให้ประสิทธิภาพลดลง
- สร้างโปรไฟล์ใหม่หลังจากรัน R8 เนื่องจาก R8 จะเปลี่ยนโครงสร้างโค้ดของคุณ
- ใช้โหมดการคอมไพล์แบบ "Partial" ใน Macrobenchmark เพราะโหมด "Full" จะให้ผลลัพธ์ที่คลาดเคลื่อนและไม่สะท้อนประสบการณ์การใช้งานจริงของผู้ใช้
- ทดสอบกับ Android เวอร์ชันต่างๆ เนื่องจากประสิทธิภาพที่เพิ่มขึ้นจะแตกต่างกันไปตามระดับ API ทั้งรุ่นเก่าและรุ่นใหม่
นำขั้นตอนเหล่านี้มาใช้ร่วมกันเพื่อสร้างแอปที่ทำงานได้เร็วขึ้น
ที่มา: https://dev.to/software_mvp-factory/profile-guided-optimization-for-android-app-startup-2i7a