Jetpack Compose ช่วยเร่งการพัฒนา UI และปรับปรุงการพัฒนา Android อย่างไรก็ตาม โปรดพิจารณาว่าการเพิ่ม Compose ลงในแอปที่มีอยู่จะส่งผลต่อเมตริกต่างๆ เช่น ขนาด APK ของแอป การบิลด์ และประสิทธิภาพรันไทม์อย่างไร
ขนาด APK และเวลาในการสร้าง
ส่วนนี้จะกล่าวถึงผลกระทบต่อขนาด APK และเวลาบิลด์โดยดูที่แอปตัวอย่าง Sunflower ซึ่งเป็นแอปที่แสดงแนวทางปฏิบัติแนะนำในการย้ายข้อมูลแอปที่ใช้ View ไปยัง Compose
ขนาด APK
การเพิ่มไลบรารีลงในโปรเจ็กต์จะเพิ่มขนาด APK ของโปรเจ็กต์ ผลลัพธ์ต่อไปนี้ เป็นผลลัพธ์สำหรับ APK รุ่นที่ลดขนาดแล้วของแต่ละโปรเจ็กต์ที่เปิดใช้การลดขนาดทรัพยากรและโค้ด โดยใช้โหมดเต็มรูปแบบของ R8 และวัดผลโดยใช้ ตัววิเคราะห์ APK
| ดูอย่างเดียว | Mixed Views และ Compose | เขียนเท่านั้น | |
|---|---|---|---|
| ขนาดการดาวน์โหลด | 2,252 KB | 3,034 KB | 2,966 KB |
เมื่อเพิ่ม Compose ลงใน Sunflower เป็นครั้งแรก ขนาด APK เพิ่มขึ้นจาก 2,252 KB เป็น 3,034 KB ซึ่งเพิ่มขึ้น 782 KB APK ที่สร้างขึ้นประกอบด้วย UI ที่สร้างขึ้นโดยใช้ ทั้ง View และ Compose การเพิ่มขึ้นนี้เป็นไปตามที่คาดไว้เนื่องจากมีการเพิ่มการอ้างอิงเพิ่มเติมลงใน Sunflower
ในทางกลับกัน เมื่อย้ายข้อมูล Sunflower ไปยังแอปที่ใช้ Compose อย่างเดียว ขนาด APK
ลดลงจาก 3,034 KB เป็น 2,966 KB ซึ่งลดลง 68 KB การลดลงนี้เกิดจากการนำการอ้างอิง View ที่ไม่ได้ใช้ออก เช่น AppCompat และ
ConstraintLayout
เวลาที่บิวด์ใช้
การเพิ่ม Compose จะเพิ่มเวลาบิลด์ของแอปเนื่องจากคอมไพเลอร์ Compose จะประมวลผล Composable ในแอปของคุณ ผลลัพธ์ต่อไปนี้ได้มาจากการใช้เครื่องมือ gradle-profiler แบบสแตนด์อโลน ซึ่งจะเรียกใช้การสร้างหลายครั้งเพื่อให้ได้เวลาบิลด์โดยเฉลี่ยสำหรับระยะเวลาบิลด์การแก้ไขข้อบกพร่องของ Sunflower
gradle-profiler --benchmark --project-dir . :app:assembleDebug
| ดูอย่างเดียว | Mixed Views และ Compose | เขียนเท่านั้น | |
|---|---|---|---|
| เวลาบิลด์เฉลี่ย | 299.47 มิลลิวินาที | 399.09 มิลลิวินาที | 342.16 มิลลิวินาที |
เมื่อเพิ่ม Compose ลงใน Sunflower เป็นครั้งแรก เวลาบิลด์โดยเฉลี่ยเพิ่มขึ้นจาก 299 มิลลิวินาทีเป็น 399 มิลลิวินาที ซึ่งเพิ่มขึ้น 100 มิลลิวินาที ระยะเวลานี้เกิดจากคอมไพเลอร์ Compose ที่ทำงานเพิ่มเติมเพื่อแปลงโค้ด Compose ที่กำหนดไว้ในโปรเจ็กต์
ในทางกลับกัน เวลาบิลด์โดยเฉลี่ยลดลงเหลือ 342 มิลลิวินาที ซึ่งลดลง 57 มิลลิวินาที เมื่อการย้ายข้อมูลของ Sunflower ไปยัง Compose เสร็จสมบูรณ์ การลดนี้เกิดจากหลายปัจจัยที่ช่วยลดเวลาบิลด์โดยรวม เช่น การนำการเชื่อมโยงข้อมูลออก การย้ายข้อมูลทรัพยากร Dependency ที่ใช้ kapt ไปยัง KSP และการอัปเดตทรัพยากร Dependency หลายรายการเป็นเวอร์ชันล่าสุด
สรุป
การใช้ Compose จะเพิ่มขนาด APK ของแอปอย่างมีประสิทธิภาพ และยังเพิ่มประสิทธิภาพเวลาบิลด์ของแอปเนื่องจากกระบวนการคอมไพล์โค้ด Compose ด้วย อย่างไรก็ตาม คุณต้องพิจารณาข้อแลกเปลี่ยนเหล่านี้เทียบกับประโยชน์ของ Compose โดยเฉพาะอย่างยิ่งในเรื่องการเพิ่มประสิทธิภาพของนักพัฒนาซอฟต์แวร์ เมื่อใช้ Compose ตัวอย่างเช่น ทีม Play Store พบว่า การเขียน UI ต้องใช้โค้ดน้อยกว่ามาก บางครั้งอาจน้อยลงถึง 50% ซึ่งจะช่วย เพิ่มประสิทธิภาพการทำงานและบำรุงรักษาโค้ดได้
อ่านกรณีศึกษาเพิ่มเติมได้ในใช้ Compose สำหรับ Teams
ประสิทธิภาพรันไทม์
ส่วนนี้ครอบคลุมหัวข้อที่เกี่ยวข้องกับประสิทธิภาพขณะรันไทม์ใน Jetpack Compose เพื่อช่วยให้เข้าใจว่า Jetpack Compose มีประสิทธิภาพเทียบกับระบบ View อย่างไร และคุณจะวัดประสิทธิภาพได้อย่างไร
การจัดองค์ประกอบใหม่แบบอัจฉริยะ
เมื่อส่วนต่างๆ ของ UI ไม่ถูกต้อง Compose จะพยายามทำการจัดองค์ประกอบใหม่เฉพาะ ส่วนที่ต้องอัปเดต อ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ในเอกสารประกอบวงจรของ Composables และระยะต่างๆ ของ Jetpack Compose
โปรไฟล์พื้นฐาน
โปรไฟล์พื้นฐานเป็นวิธีที่ยอดเยี่ยมในการเร่งเส้นทางของผู้ใช้ทั่วไป การรวมโปรไฟล์พื้นฐานไว้ในแอปจะช่วยปรับปรุงความเร็วในการเรียกใช้โค้ดได้ประมาณ 30% ตั้งแต่การเปิดตัวครั้งแรก โดยหลีกเลี่ยงขั้นตอนการตีความและการคอมไพล์ JIT (Just-In-Time) สำหรับเส้นทางโค้ดที่รวมไว้
ไลบรารี Jetpack Compose มีโปรไฟล์พื้นฐานของตัวเอง และคุณจะได้รับการเพิ่มประสิทธิภาพเหล่านี้โดยอัตโนมัติเมื่อใช้ Compose ในแอป อย่างไรก็ตาม การเพิ่มประสิทธิภาพเหล่านี้จะส่งผลต่อเส้นทางโค้ดภายในไลบรารี Compose เท่านั้น ดังนั้นเราขอแนะนำให้คุณเพิ่มโปรไฟล์พื้นฐาน ลงในแอปเพื่อครอบคลุมเส้นทางโค้ดภายนอก Compose
การเปรียบเทียบกับระบบ View
Jetpack Compose มีการปรับปรุงหลายอย่างเหนือกว่าระบบ View การปรับปรุงเหล่านี้ มีคำอธิบายในส่วนต่อไปนี้
ทุกอย่างขยายมุมมอง
View ทุกรายการที่วาดบนหน้าจอ เช่น TextView, Button หรือ ImageView ต้องมีการจัดสรรหน่วยความจำ การติดตามสถานะที่ชัดเจน และการเรียกกลับต่างๆ เพื่อรองรับ Use Case ทั้งหมด นอกจากนี้ View เจ้าของที่กำหนดเองต้อง
ใช้ตรรกะที่ชัดเจนเพื่อป้องกันการวาดซ้ำเมื่อไม่
จำเป็น เช่น สำหรับการประมวลผลข้อมูลที่ซ้ำกัน
Jetpack Compose แก้ปัญหานี้ได้หลายวิธี Compose ไม่มีออบเจ็กต์ที่อัปเดตได้โดยชัดแจ้งสำหรับวาดมุมมอง องค์ประกอบ UI คือฟังก์ชันที่ประกอบกันได้แบบง่ายๆ
ซึ่งมีข้อมูลที่เขียนลงในการจัดองค์ประกอบในลักษณะที่เล่นซ้ำได้ ซึ่งจะช่วย
ลดการติดตามสถานะที่ชัดเจน การจัดสรรหน่วยความจำ และการเรียกกลับให้เหลือเฉพาะ
Composables ที่ต้องใช้ฟีเจอร์ดังกล่าวแทนที่จะกำหนดให้ส่วนขยายทั้งหมดของViewประเภทหนึ่งๆ ต้องใช้
นอกจากนี้ Compose ยังมีการจัดองค์ประกอบใหม่แบบอัจฉริยะ ซึ่งจะเล่นผลลัพธ์ที่วาดก่อนหน้านี้ซ้ำหากคุณไม่จำเป็นต้องทำการเปลี่ยนแปลง
การส่งผ่านเลย์เอาต์หลายครั้ง
ViewGroup แบบเดิมมี API การวัดและเลย์เอาต์ที่แสดงออกได้มาก ซึ่งทำให้มีแนวโน้มที่จะต้องผ่านเลย์เอาต์หลายครั้ง การส่งเลย์เอาต์หลายครั้งนี้อาจทำให้เกิดการทำงานแบบทวีคูณหากดำเนินการที่จุดที่ซ้อนกันในลำดับชั้นของมุมมอง
Jetpack Compose บังคับใช้การส่งเลย์เอาต์ครั้งเดียว สำหรับ Composable ของเลย์เอาต์ทั้งหมดผ่านสัญญา API ซึ่งช่วยให้ Compose จัดการ แผนผัง UI ที่ซับซ้อนได้อย่างมีประสิทธิภาพ หากต้องการการวัดหลายรายการ Compose มีการวัดโดยธรรมชาติ
ดูประสิทธิภาพการเริ่มต้นใช้งาน
ระบบ View ต้องขยายเลย์เอาต์ XML เมื่อแสดงเลย์เอาต์หนึ่งๆ เป็นครั้งแรก ค่าใช้จ่ายนี้จะบันทึกไว้ใน Jetpack Compose เนื่องจากเลย์เอาต์เขียนด้วย Kotlin และคอมไพล์เหมือนกับส่วนอื่นๆ ของแอป
Benchmark Compose
ใน Jetpack Compose 1.0 ประสิทธิภาพของแอปในโหมด debug และ release มีความแตกต่างกันอย่างเห็นได้ชัด
สำหรับเวลาที่เป็นตัวแทน ให้
ใช้บิลด์ release แทน debug เสมอเมื่อทำการโปรไฟล์แอป
หากต้องการตรวจสอบประสิทธิภาพของโค้ด Jetpack Compose คุณสามารถใช้ไลบรารี Jetpack Macrobenchmark ได้ ดูวิธี ใช้กับ Jetpack Compose ได้ที่ โปรเจ็กต์ MacrobenchmarkSample
ทีม Jetpack Compose ยังใช้ Macrobenchmark เพื่อตรวจหาการถดถอยที่อาจเกิดขึ้นด้วย เช่น ดูการเปรียบเทียบสำหรับคอลัมน์ที่โหลดแบบ Lazy และแดชบอร์ด เพื่อติดตามการถดถอย
เขียนการติดตั้งโปรไฟล์
เนื่องจาก Jetpack Compose เป็นไลบรารีที่ไม่ได้รวมไว้ จึงไม่ได้รับประโยชน์จาก Zygote ที่โหลดล่วงหน้าสำหรับคลาส UI Toolkit และ Drawable ของระบบ View Jetpack Compose 1.0 ใช้การติดตั้งโปรไฟล์สำหรับบิลด์รีลีส โปรแกรมติดตั้งโปรไฟล์ช่วยให้แอปสามารถระบุโค้ดที่สําคัญเพื่อ คอมไพล์ล่วงหน้า (AOT) ในเวลาที่ติดตั้ง สร้างกฎการติดตั้งโปรไฟล์การจัดส่งของ Compose ซึ่งจะช่วยลดเวลาเริ่มต้นและอาการกระตุกในแอป Compose
แนะนำสำหรับคุณ
- หมายเหตุ: ข้อความลิงก์จะแสดงเมื่อ JavaScript ปิดอยู่
- ข้อควรพิจารณาอื่นๆ
- การใช้ Compose ใน View
- เลื่อน