Jetpack Compose ช่วยเร่งการพัฒนา UI และปรับปรุงการพัฒนา Android อย่างไรก็ตาม โปรดพิจารณาว่าการเพิ่ม Compose ลงในแอปที่มีอยู่จะส่งผลต่อเมตริกต่างๆ เช่น ขนาด APK ของแอป การสร้าง และประสิทธิภาพรันไทม์อย่างไร
ขนาด APK และเวลาในการสร้าง
ส่วนนี้จะกล่าวถึงผลกระทบต่อขนาด APK และเวลาในการสร้างโดยดูที่แอปตัวอย่าง Sunflower ซึ่งเป็นแอปที่แสดงแนวทางปฏิบัติแนะนำ ในการย้ายข้อมูลแอปที่อิงตาม View ไปยัง Compose
ขนาด APK
การเพิ่มไลบรารีลงในโปรเจ็กต์จะเพิ่มขนาด APK ผลลัพธ์ต่อไปนี้ เป็นผลลัพธ์สำหรับ APK รุ่นที่ลดขนาดแล้วของแต่ละโปรเจ็กต์ที่เปิดใช้การลดขนาดทรัพยากรและโค้ดโดยใช้โหมดเต็มของ R8 และวัดผลโดยใช้ตัววิเคราะห์ APK
ยอดดูเท่านั้น | มุมมองแบบผสมและเขียน | เขียนเท่านั้น | |
---|---|---|---|
ขนาดการดาวน์โหลด | 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
ยอดดูเท่านั้น | มุมมองแบบผสมและเขียน | เขียนเท่านั้น | |
---|---|---|---|
เวลาบิลด์โดยเฉลี่ย | 299.47 มิลลิวินาที | 399.09 มิลลิวินาที | 342.16 มิลลิวินาที |
เมื่อเพิ่ม Compose ลงใน Sunflower เป็นครั้งแรก เวลาในการสร้างโดยเฉลี่ยเพิ่มขึ้นจาก 299 มิลลิวินาทีเป็น 399 มิลลิวินาที ซึ่งเพิ่มขึ้น 100 มิลลิวินาที ระยะเวลานี้เกิดจากคอมไพเลอร์ Compose ที่ทำงานเพิ่มเติมเพื่อเปลี่ยนโค้ด Compose ที่กำหนดไว้ในโปรเจ็กต์
ในทางกลับกัน เวลาในการสร้างโดยเฉลี่ยลดลงเหลือ 342 มิลลิวินาที ซึ่งลดลง 57 มิลลิวินาที เมื่อการย้ายข้อมูลของ Sunflower ไปยัง Compose เสร็จสมบูรณ์ การลดขนาดนี้เกิดจากหลายปัจจัยที่ช่วยลดเวลาในการบิลด์ เช่น การนำการเชื่อมโยงข้อมูลออก การย้ายข้อมูลการอ้างอิงที่ใช้ kapt ไปยัง KSP และการอัปเดตการอ้างอิงหลายรายการเป็นเวอร์ชันล่าสุด
สรุป
การใช้ Compose จะเพิ่มขนาด APK ของแอปอย่างมีประสิทธิภาพ และยัง เพิ่มประสิทธิภาพเวลาในการบิลด์ของแอปเนื่องจากกระบวนการคอมไพล์ โค้ด Compose ด้วย อย่างไรก็ตาม คุณต้องพิจารณาข้อแลกเปลี่ยนเหล่านี้เทียบกับประโยชน์ของ Compose โดยเฉพาะอย่างยิ่งในเรื่องการเพิ่มประสิทธิภาพการทำงานของนักพัฒนาซอฟต์แวร์ เมื่อใช้ Compose ตัวอย่างเช่น ทีม Play Store พบว่า การเขียน UI ต้องใช้โค้ดน้อยลงมาก บางครั้งอาจน้อยลงถึง 50% ซึ่งจะช่วย เพิ่มประสิทธิภาพการทำงานและบำรุงรักษาโค้ดได้
อ่านกรณีศึกษาเพิ่มเติมได้ในใช้ Compose สำหรับ Teams
ประสิทธิภาพรันไทม์
ส่วนนี้ครอบคลุมหัวข้อที่เกี่ยวข้องกับประสิทธิภาพรันไทม์ใน Jetpack Compose เพื่อช่วยให้เข้าใจว่า Jetpack Compose มีประสิทธิภาพเทียบเท่ากับระบบ View อย่างไร และวิธีวัดประสิทธิภาพ
การจัดองค์ประกอบใหม่แบบอัจฉริยะ
เมื่อส่วนต่างๆ ของ UI ไม่ถูกต้อง Compose จะพยายามทำการจัดองค์ประกอบใหม่เฉพาะ ส่วนที่ต้องอัปเดต อ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ในเอกสารประกอบวงจรการใช้งานของ Composable และระยะต่างๆ ของ Jetpack Compose
โปรไฟล์พื้นฐาน
โปรไฟล์พื้นฐานเป็นวิธีที่ยอดเยี่ยมในการเร่งเส้นทางของผู้ใช้ทั่วไป การรวม Baseline Profile ไว้ในแอปจะช่วยปรับปรุงความเร็วในการเรียกใช้โค้ดได้ประมาณ 30% ตั้งแต่การเปิดตัวครั้งแรก โดยหลีกเลี่ยงขั้นตอนการตีความและการคอมไพล์แบบทันที (JIT) สำหรับเส้นทางโค้ดที่รวมไว้
ไลบรารี Jetpack Compose มี Baseline Profile ของตัวเอง และคุณจะได้รับการเพิ่มประสิทธิภาพเหล่านี้โดยอัตโนมัติเมื่อใช้ Compose ในแอป อย่างไรก็ตาม การเพิ่มประสิทธิภาพเหล่านี้จะส่งผลต่อเส้นทางโค้ดภายในไลบรารี Compose เท่านั้น ดังนั้นเราขอแนะนำให้คุณเพิ่ม Baseline Profile ลงในแอปเพื่อครอบคลุมเส้นทางโค้ดภายนอก Compose
การเปรียบเทียบกับระบบยอดดู
Jetpack Compose มีการปรับปรุงหลายอย่างเหนือกว่าระบบ View เราจะอธิบายการปรับปรุงเหล่านี้ ในส่วนต่อไปนี้
ทุกอย่างขยายมุมมอง
View
ทุกรายการที่วาดบนหน้าจอ เช่น TextView
, Button
หรือ
ImageView
ต้องมีการจัดสรรหน่วยความจำ การติดตามสถานะที่ชัดเจน และ
การเรียกกลับต่างๆ เพื่อรองรับกรณีการใช้งานทั้งหมด นอกจากนี้ View
เจ้าของ
ที่กำหนดเองต้องใช้ตรรกะที่ชัดเจนเพื่อป้องกันการวาดซ้ำเมื่อไม่
จำเป็น เช่น สำหรับการประมวลผลข้อมูลที่ซ้ำกัน
Jetpack Compose แก้ปัญหานี้ได้หลายวิธี Compose ไม่มีออบเจ็กต์ที่อัปเดตได้ที่ชัดเจนสำหรับมุมมองการวาด องค์ประกอบ UI เป็นฟังก์ชันที่เรียบง่ายและสามารถรวมกันได้
ซึ่งมีข้อมูลที่เขียนลงในการจัดองค์ประกอบในลักษณะที่เล่นซ้ำได้ ซึ่งจะช่วย
ลดการติดตามสถานะที่ชัดเจน การจัดสรรหน่วยความจำ และการเรียกกลับให้เหลือเฉพาะ
Composables ที่ต้องใช้ฟีเจอร์ดังกล่าวแทนที่จะต้องใช้ฟีเจอร์ดังกล่าวโดยส่วนขยายทั้งหมดของView
ประเภทที่กำหนด
นอกจากนี้ Compose ยังมีการจัดองค์ประกอบใหม่แบบอัจฉริยะ ซึ่งจะเล่นผลลัพธ์ที่วาดก่อนหน้านี้ซ้ำหากคุณไม่จำเป็นต้องทำการเปลี่ยนแปลง
การส่งเลย์เอาต์หลายรายการ
ViewGroups แบบเดิมมีฟีเจอร์มากมายใน 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
แนะนำสำหรับคุณ
- หมายเหตุ: ข้อความลิงก์จะแสดงเมื่อ JavaScript ปิดอยู่
- ข้อควรพิจารณาอื่นๆ
- การใช้ Compose ใน Views
- เลื่อน