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

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

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

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

ขนาด APK

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

การดูเท่านั้น มุมมองแบบผสมและการเขียน เขียนเท่านั้น
ขนาดการดาวน์โหลด 2,252 KB 3,034 กิโลไบต์ 2,966 กิโลไบต์

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

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

เวลาที่สร้าง

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

gradle-profiler --benchmark --project-dir . :app:assembleDebug
การดูเท่านั้น มุมมองแบบผสมและการเขียน เขียนเท่านั้น
เวลาเฉลี่ยของบิลด์ 299.47 มิลลิวินาที 399.09 มิลลิวินาที 342.16 มิลลิวินาที

เมื่อเพิ่ม Compose ไปยัง Sunflower เป็นครั้งแรก เวลาเฉลี่ยในการสร้างจะเพิ่มขึ้นจาก 299 มิลลิวินาทีถึง 399 มิลลิวินาที — เพิ่มขึ้น 100 มิลลิวินาที ระยะเวลานี้เกิดจากการคอมไพเลอร์ของ Compose ดำเนินการเพิ่มเติมเพื่อเปลี่ยนรูปแบบโค้ด Compose ที่กำหนดไว้ในโปรเจ็กต์

ในทางกลับกัน เวลาเฉลี่ยในการสร้างจะลดลงเหลือ 342 มิลลิวินาที ซึ่งลดลง 57 มิลลิวินาที เมื่อ การย้ายข้อมูลของ Sunflower ไปยัง Compose เสร็จสมบูรณ์แล้ว การลดนี้สามารถระบุแหล่งที่มาได้ เป็นหลายๆ ปัจจัยที่รวมกันเป็นการลดเวลาของบิลด์ เช่น การนำข้อมูลออก การเชื่อมโยง การย้ายข้อมูลทรัพยากร Dependency ที่ใช้ kapt ไปยัง KSP และการอัปเดต ทรัพยากร Dependency ต่างๆ ในเวอร์ชันล่าสุด

สรุป

การใช้ Compose จะเพิ่มขนาด APK ของแอปได้อย่างมีประสิทธิภาพและ เพิ่มประสิทธิภาพเวลาบิลด์ของแอปเนื่องจากกระบวนการคอมไพล์ ของ Compose Code อย่างไรก็ตาม จุดแข็งเหล่านี้ต้องมีการชั่งน้ำหนักกับ ประโยชน์ของ Compose โดยเฉพาะอย่างยิ่งในการเพิ่มประสิทธิภาพการทำงานของนักพัฒนาซอฟต์แวร์ เมื่อนำการเขียนมาใช้ ตัวอย่างเช่น ทีม Play Store พบว่า ที่ UI การเขียนต้องใช้โค้ดน้อยกว่ามาก บางครั้งถึง 50% การเพิ่มประสิทธิภาพการทำงานและการบำรุงรักษาโค้ด

อ่านกรณีศึกษาเพิ่มเติมได้ในใช้ Compose สำหรับทีม

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

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

การจัดองค์ประกอบใหม่อัจฉริยะ

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

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

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

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

การเปรียบเทียบกับระบบมุมมอง

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

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

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

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

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

บัตรผ่านโดยใช้เลย์เอาต์หลายรายการ

ViewGroups แบบเดิมมีความสามารถที่ชัดเจนในการวัดผลและการจัดวาง API ที่ทำให้มีแนวโน้มที่จะใช้บัตรผ่านเลย์เอาต์หลายรายการได้ เลย์เอาต์หลายแบบเหล่านี้ บัตรอาจทำให้เกิดงานแบบเอ็กซ์โปเนนเชียลหากทำในจุดที่ฝังบางจุดในมุมมอง ลำดับชั้น

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

ดูประสิทธิภาพของสตาร์ทอัพ

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

การเขียนเปรียบเทียบ

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

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

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

เขียนการติดตั้งโปรไฟล์

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