เปรียบเทียบเมตริก "เขียน" และ "ดู"

Jetpack Compose ช่วยเร่งการพัฒนา UI และ ปรับปรุงการพัฒนา Android อย่างไรก็ตาม ให้พิจารณาว่าการเพิ่ม Compose ลงในแอปที่มีอยู่อาจส่งผลต่อเมตริกต่างๆ เช่น ขนาด APK, การบิลด์ และประสิทธิภาพขณะรันไทม์ของแอปอย่างไร

ขนาด APK และเวลาในการบิวด์

ส่วนนี้จะกล่าวถึงผลกระทบต่อขนาด APK และเวลาบิลด์โดยดูจากแอปตัวอย่าง Sunflower ซึ่งเป็นแอปที่แสดงแนวทางปฏิบัติแนะนำ ในการย้ายข้อมูลแอปที่อิงตาม View ไปยัง Compose

ขนาด APK

การเพิ่มไลบรารีลงในโปรเจ็กต์จะเพิ่มขนาด APK ของโปรเจ็กต์ ผลลัพธ์ต่อไปนี้ เป็นผลลัพธ์ของ APK เวอร์ชันที่ใช้งานจริงที่ย่อขนาดแล้วของแต่ละโปรเจ็กต์โดยเปิดใช้การย่อขนาดทรัพยากรและโค้ด ใช้โหมด R8 แบบเต็ม และวัดโดยใช้ตัววิเคราะห์ APK

Views เท่านั้น Views และ Compose ผสมกัน Compose เท่านั้น
ขนาดการดาวน์โหลด 2,252 KB 3,034 KB 2,966 KB

เมื่อเพิ่ม Compose ลงใน Sunflower เป็นครั้งแรก ขนาด APK เพิ่มขึ้นจาก 2,252 KB เป็น 3,034 KB หรือเพิ่มขึ้น 782 KB APK ที่สร้างขึ้นประกอบด้วย UI ที่บิวด์ด้วย Views และ Compose ผสมกัน การเพิ่มขึ้นนี้เป็นสิ่งที่คาดการณ์ได้เนื่องจากมีการเพิ่มทรัพยากร Dependency ลงใน Sunflower

ในทางกลับกัน เมื่อย้ายข้อมูล Sunflower ไปยังแอปที่ใช้ Compose อย่างเดียว ขนาด APK ลดลงจาก 3,034 KB เป็น 2,966 KB หรือลดลง 68 KB การลดลงนี้เกิดจากการนำทรัพยากร Dependency ของ View ที่ไม่ได้ใช้ออก เช่น AppCompat และ ConstraintLayout

เวลาบิลด์

การเพิ่ม Compose จะเพิ่มเวลาบิลด์ของแอปเนื่องจากคอมไพเลอร์ Compose ประมวลผล Composable ในแอป ผลลัพธ์ต่อไปนี้ได้มาจากการใช้เครื่องมือ gradle-profiler แบบสแตนด์อโลน ซึ่งจะเรียกใช้การบิลด์หลายครั้งเพื่อให้ได้เวลาบิลด์เฉลี่ยสำหรับระยะเวลาการบิลด์การแก้ไขข้อบกพร่องของ Sunflower

gradle-profiler --benchmark --project-dir . :app:assembleDebug
Views เท่านั้น Views และ Compose ผสมกัน 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 สำหรับทีม

ประสิทธิภาพขณะรันไทม์

ส่วนนี้จะครอบคลุมหัวข้อที่เกี่ยวข้องกับประสิทธิภาพขณะรันไทม์ใน Jetpack Compose เพื่อช่วยให้คุณเข้าใจว่า Jetpack Compose มีประสิทธิภาพเป็นอย่างไรเมื่อเทียบกับระบบ View และวิธีวัดประสิทธิภาพ

การประกอบใหม่แบบอัจฉริยะ

เมื่อ UI บางส่วนไม่ถูกต้อง Compose จะพยายามประกอบใหม่เฉพาะส่วนที่ต้องอัปเดต อ่านข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ในเอกสารประกอบเรื่องวงจรการใช้งานของ Composable และระยะต่างๆ ของ Jetpack Compose

โปรไฟล์พื้นฐาน

โปรไฟล์พื้นฐานเป็น วิธีที่ยอดเยี่ยมในการเร่งการเข้าชมทั่วไปของผู้ใช้ การรวมโปรไฟล์พื้นฐานไว้ในแอปจะช่วยปรับปรุงความเร็วในการเรียกใช้โค้ดได้ประมาณ 30% นับตั้งแต่การเปิดตัวครั้งแรกโดยหลีกเลี่ยงขั้นตอนการตีความและการคอมไพล์แบบ JIT (Just-In-Time) สำหรับเส้นทางโค้ดที่รวมไว้

ไลบรารี Jetpack Compose มีโปรไฟล์พื้นฐานของตัวเอง และคุณ จะได้รับการเพิ่มประสิทธิภาพเหล่านี้โดยอัตโนมัติเมื่อใช้ Compose ในแอป อย่างไรก็ตาม การเพิ่มประสิทธิภาพเหล่านี้จะส่งผลต่อเส้นทางโค้ดภายในไลบรารี Compose เท่านั้น ดังนั้นเรา ขอแนะนำให้คุณ เพิ่มโปรไฟล์พื้นฐาน ลงใน แอปเพื่อครอบคลุมเส้นทางโค้ดภายนอก Compose

การเปรียบเทียบกับระบบ View

Jetpack Compose มีการปรับปรุงหลายอย่างเมื่อเทียบกับระบบ View การปรับปรุงเหล่านี้อธิบายไว้ในส่วนต่อไปนี้

ทุกอย่างขยาย View

View ทุกรายการที่วาดบนหน้าจอ เช่น TextView, Button, หรือ ImageView ต้องมีการจัดสรรหน่วยความจำ การติดตามสถานะอย่างชัดเจน และการเรียกกลับต่างๆ เพื่อรองรับกรณีการใช้งานทั้งหมด นอกจากนี้ เจ้าของ View ที่กำหนดเองต้องใช้ตรรกะที่ชัดเจนเพื่อป้องกันการวาดซ้ำเมื่อไม่จำเป็น เช่น สำหรับการประมวลผลข้อมูลซ้ำๆ

Jetpack Compose แก้ปัญหานี้ได้หลายวิธี Compose ไม่มีออบเจ็กต์ที่อัปเดตได้ที่ชัดเจนสำหรับการวาด View องค์ประกอบ UI เป็นฟังก์ชัน Composable ที่เรียบง่ายซึ่งข้อมูลจะเขียนลงในการประกอบในลักษณะที่เล่นซ้ำได้ วิธีนี้ช่วยลดการติดตามสถานะอย่างชัดเจน การจัดสรรหน่วยความจำ และการเรียกกลับให้เหลือเฉพาะ Composable ที่ต้องใช้ฟีเจอร์ดังกล่าวแทนที่จะกำหนดให้ส่วนขยายทั้งหมดของ View ประเภทหนึ่งๆ ต้องใช้

นอกจากนี้ Compose ยังมีการประกอบใหม่แบบ อัจฉริยะ โดยจะเล่นซ้ำผลลัพธ์ที่วาดไว้ก่อนหน้านี้หากคุณไม่จำเป็นต้องทำการเปลี่ยนแปลง

การส่งผ่านเลย์เอาต์หลายครั้ง

ViewGroup แบบดั้งเดิมมีความสามารถในการแสดงออกมากมายใน API การวัดและการจัดวาง ซึ่งทำให้ ViewGroup เหล่านั้นมีแนวโน้มที่จะมีการส่งผ่านเลย์เอาต์หลายครั้ง การส่งผ่านเลย์เอาต์หลายครั้งอาจทำให้เกิดงานที่เพิ่มขึ้นแบบทวีคูณหากดำเนินการในจุดที่ซ้อนกันที่เฉพาะเจาะจงในลำดับชั้นของ View

Jetpack Compose บังคับใช้การส่งผ่านเลย์เอาต์ครั้งเดียว สำหรับ Composable เลย์เอาต์ทั้งหมดผ่านสัญญา API ซึ่งช่วยให้ Compose จัดการโครงสร้าง UI ที่ซับซ้อนได้อย่างมีประสิทธิภาพ หากจำเป็นต้องมีการวัดหลายครั้ง Compose จะมี การวัดค่าโดยนัย

ประสิทธิภาพการเริ่มต้น View

ระบบ View ต้องขยายเลย์เอาต์ XML เมื่อแสดงเลย์เอาต์ที่เฉพาะเจาะจงเป็นครั้งแรก Jetpack Compose ช่วยประหยัดค่าใช้จ่ายนี้เนื่องจากเลย์เอาต์เขียนด้วย Kotlin และคอมไพล์เหมือนกับส่วนอื่นๆ ของแอป

การเปรียบเทียบ Compose

ใน Jetpack Compose 1.0 ประสิทธิภาพของแอปในโหมด debug และ release แตกต่างกันอย่างเห็นได้ชัด หากต้องการดูระยะเวลาที่เป็นตัวแทน ให้ใช้บิวด์ release เสมอ แทน debug เมื่อสร้างโปรไฟล์แอป

หากต้องการตรวจสอบประสิทธิภาพของโค้ด Jetpack Compose คุณสามารถใช้ไลบรารี Jetpack Macrobenchmark ได้ ดูวิธีใช้ไลบรารีนี้กับ Jetpack Compose ได้ในโปรเจ็กต์ MacrobenchmarkSample

ทีม Jetpack Compose ยังใช้ Macrobenchmark เพื่อตรวจหาการถดถอยที่อาจเกิดขึ้น เช่น ดูการเปรียบเทียบสำหรับคอลัมน์แบบ Lazy และแดชบอร์ด เพื่อติดตามการถดถอย

การติดตั้งโปรไฟล์ Compose

เนื่องจาก Jetpack Compose เป็นไลบรารีที่ไม่ได้รวมไว้ จึงไม่ได้รับประโยชน์จาก Zygote ที่โหลดล่วงหน้าคลาสและ Drawable ของชุดเครื่องมือ UI ของระบบ View Jetpack Compose 1.0 ใช้การติดตั้งโปรไฟล์สำหรับบิวด์ release โปรแกรมติดตั้งโปรไฟล์ช่วยให้แอประบุโค้ดที่สำคัญที่จะ คอมไพล์ AOT (Ahead-Of-Time) ในเวลาที่ติดตั้งได้ Compose มาพร้อมกับกฎการติดตั้งโปรไฟล์ซึ่งช่วยลดเวลาเริ่มต้นและอาการกระตุกในแอป Compose