เราขอแนะนำให้ใช้ Jetpack Macrobenchmark เพื่อทดสอบประสิทธิภาพของแอปเมื่อเปิดใช้โปรไฟล์พื้นฐาน แล้วเปรียบเทียบผลลัพธ์เหล่านั้นกับการเปรียบเทียบเมื่อปิดใช้โปรไฟล์พื้นฐาน แนวทางนี้ช่วยให้คุณวัดเวลาเริ่มต้นของแอปได้ ทั้งเวลาในการแสดงผลครั้งแรกและการแสดงผลเต็มรูปแบบ หรือประสิทธิภาพการแสดงผลรันไทม์เพื่อดูว่าเฟรมที่สร้างขึ้นอาจทำให้เกิดอาการกระตุกหรือไม่
การทดสอบประสิทธิภาพแบบมาโครช่วยให้คุณควบคุมการคอมไพล์ก่อนการวัดผลได้โดยใช้ CompilationMode
API ใช้ค่า CompilationMode
ที่แตกต่างกันเพื่อเปรียบเทียบประสิทธิภาพกับสถานะการคอมไพล์ที่แตกต่างกัน ข้อมูลโค้ดต่อไปนี้แสดงวิธีใช้พารามิเตอร์ CompilationMode
เพื่อวัดประโยชน์ของโปรไฟล์พื้นฐาน
@RunWith(AndroidJUnit4ClassRunner::class) class ColdStartupBenchmark { @get:Rule val benchmarkRule = MacrobenchmarkRule() // No ahead-of-time (AOT) compilation at all. Represents performance of a // fresh install on a user's device if you don't enable Baseline Profiles— // generally the worst case performance. @Test fun startupNoCompilation() = startup(CompilationMode.None()) // Partial pre-compilation with Baseline Profiles. Represents performance of // a fresh install on a user's device. @Test fun startupPartialWithBaselineProfiles() = startup(CompilationMode.Partial(baselineProfileMode = BaselineProfileMode.Require)) // Partial pre-compilation with some just-in-time (JIT) compilation. // Represents performance after some app usage. @Test fun startupPartialCompilation() = startup( CompilationMode.Partial( baselineProfileMode = BaselineProfileMode.Disable, warmupIteration = 3 ) ) // Full pre-compilation. Generally not representative of real user // experience, but can yield more stable performance metrics by removing // noise from JIT compilation within benchmark runs. @Test fun startupFullCompilation() = startup(CompilationMode.Full()) private fun startup(compilationMode: CompilationMode) = benchmarkRule.measureRepeated( packageName = "com.example.macrobenchmark.target", metrics = listOf(StartupTimingMetric()), compilationMode = compilationMode, iterations = 10, startupMode = StartupMode.COLD, setupBlock = { pressHome() } ) { // Waits for the first rendered frame, which represents time to initial display. startActivityAndWait() // Waits for content to be visible, which represents time to fully drawn. device.wait(Until.hasObject(By.res("my-content")), 5_000) } }
ในภาพหน้าจอต่อไปนี้ คุณจะเห็นผลลัพธ์ใน Android Studio โดยตรงสำหรับแอปตัวอย่างใน Android ตอนนี้ที่ทำงานบน Google Pixel 7 ผลลัพธ์แสดงให้เห็นว่าการเริ่มต้นแอปเร็วที่สุดเมื่อใช้โปรไฟล์พื้นฐาน (229.0ms) เมื่อเทียบกับการไม่คอมไพล์ (324.8ms)
แม้ว่าตัวอย่างก่อนหน้านี้จะแสดงผลลัพธ์การเริ่มต้นของแอปที่บันทึกไว้ด้วย StartupTimingMetric
แต่ก็มีเมตริกสำคัญอื่นๆ ที่ควรพิจารณาด้วย เช่น FrameTimingMetric
ดูข้อมูลเพิ่มเติมเกี่ยวกับเมตริกทุกประเภทได้ที่บันทึกเมตริกการทดสอบประสิทธิภาพแบบแมโคร
เวลาที่ใช้ในการแสดงผลครบถ้วน
ตัวอย่างก่อนหน้านี้จะวัดเวลาที่ใช้ในการแสดงผลครั้งแรก (TTID) ซึ่งเป็นเวลาที่แอปใช้ในการสร้างเฟรมแรก อย่างไรก็ตาม ข้อมูลนี้ไม่ได้แสดงถึงเวลาที่ผู้ใช้จะเริ่มโต้ตอบกับแอปของคุณเสมอไป เมตริกเวลาในการแสดงผลแบบเต็ม (TTFD) มีประโยชน์มากกว่าในการวัดและเพิ่มประสิทธิภาพเส้นทางโค้ดที่จําเป็นต่อสถานะแอปที่ใช้งานได้อย่างเต็มรูปแบบ
เราขอแนะนําให้เพิ่มประสิทธิภาพทั้ง TTID และ TTFD เนื่องจากทั้ง 2 รายการมีความสําคัญ TTID ที่ต่ำจะช่วยให้ผู้ใช้เห็นว่าแอปกำลังเปิดอยู่ การรักษา TTFD ให้สั้นเป็นสิ่งสำคัญที่จะช่วยให้ผู้ใช้โต้ตอบกับแอปได้อย่างรวดเร็ว
ดูกลยุทธ์ในการรายงานเมื่อ UI ของแอปวาดเสร็จแล้วได้ที่ปรับปรุงความแม่นยำของเวลาเริ่มต้น
แนะนำสำหรับคุณ
- หมายเหตุ: ข้อความลิงก์จะแสดงเมื่อ JavaScript ปิดอยู่
- [เขียน Macrobenchmark][11]
- [บันทึกเมตริกการทดสอบประสิทธิภาพแบบรวม][12]
- [การวิเคราะห์และการเพิ่มประสิทธิภาพการเริ่มต้นของแอป {:#app-startup-analysis-optimization}][13]