เราขอแนะนำให้ใช้ Jetpack Macrobenchmark เพื่อทดสอบประสิทธิภาพของแอปเมื่อเปิดใช้ Baseline Profile แล้วเปรียบเทียบผลลัพธ์เหล่านั้นกับการเปรียบเทียบที่ปิดใช้ Baseline Profile วิธีนี้ช่วยให้คุณวัดเวลาเริ่มต้นของแอปได้ ทั้งเวลาในการแสดงผลครั้งแรกและเวลาในการแสดงผลแบบเต็ม หรือประสิทธิภาพการแสดงผลรันไทม์เพื่อดูว่าเฟรมที่สร้างขึ้นทำให้เกิดอาการกระตุกหรือไม่
Macrobenchmark ช่วยให้คุณควบคุมการคอมไพล์ก่อนการวัดได้โดยใช้ API CompilationMode ใช้ค่า 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() } ) { uiAutomator { startApp(packageName) onElement(5_000) { viewIdResourceName == "my-content"} } } }
ในภาพหน้าจอต่อไปนี้ คุณจะเห็นผลลัพธ์โดยตรงใน Android Studio สำหรับแอปตัวอย่าง Now in Android ที่ทำงานบน Google Pixel 7 ผลลัพธ์แสดงให้เห็นว่าการเริ่มต้นแอปจะเร็วที่สุดเมื่อใช้ Baseline Profile (229.0 มิลลิวินาที) ตรงกันข้ามกับการไม่มีการคอมไพล์ (324.8 มิลลิวินาที)
ColdStartupBenchmark แสดงเวลาที่ใช้ในการแสดงผลครั้งแรกโดยไม่มีการคอมไพล์ (324 มิลลิวินาที) การคอมไพล์แบบเต็ม (315 มิลลิวินาที) การคอมไพล์บางส่วน (312 มิลลิวินาที) และ Baseline Profile (229 มิลลิวินาที)แม้ว่าตัวอย่างก่อนหน้านี้จะแสดงผลลัพธ์การเริ่มต้นแอปที่บันทึกด้วย StartupTimingMetric แต่ก็ยังมีเมตริกสำคัญอื่นๆ ที่ควรพิจารณา เช่น FrameTimingMetric ดูข้อมูลเพิ่มเติมเกี่ยวกับเมตริกทุกประเภทได้ที่บันทึกเมตริก Macrobenchmark
เวลาที่ใช้ในการแสดงผลเต็มรูปแบบ
ตัวอย่างก่อนหน้านี้จะวัดเวลาที่ใช้ในการแสดงผลครั้งแรก (TTID) ซึ่งเป็นเวลาที่แอปใช้ในการสร้างเฟรมแรก อย่างไรก็ตาม เมตริกนี้ไม่ได้แสดงถึงเวลาที่ผู้ใช้จะเริ่มโต้ตอบกับแอปได้ เมตริกเวลาในการแสดงผลเต็มรูปแบบ (TTFD) มีประโยชน์มากกว่าในการวัดและเพิ่มประสิทธิภาพเส้นทางโค้ดที่จำเป็นเพื่อให้แอปอยู่ในสถานะที่ใช้งานได้อย่างเต็มรูปแบบ
เราขอแนะนำให้เพิ่มประสิทธิภาพทั้ง TTID และ TTFD เนื่องจากทั้ง 2 อย่างมีความสำคัญ TTID ที่ต่ำจะช่วยให้ผู้ใช้เห็นว่าแอปกำลังเปิดอยู่จริงๆ การทำให้ TTFD สั้นเป็นสิ่งสำคัญที่จะช่วยให้ผู้ใช้โต้ตอบกับแอปได้อย่างรวดเร็ว
ดูกลยุทธ์ในการรายงานเมื่อ UI ของแอปแสดงผลอย่างสมบูรณ์ได้ที่ปรับปรุงความแม่นยำของเวลาเริ่มต้น
แนะนำสำหรับคุณ
- หมายเหตุ: ข้อความลิงก์จะแสดงเมื่อ JavaScript ปิดอยู่
- [เขียน Macrobenchmark][11]
- [บันทึกเมตริก Macrobenchmark][12]
- เขียนการทดสอบอัตโนมัติด้วย UI Automator
- [การวิเคราะห์และการเพิ่มประสิทธิภาพการเริ่มต้นแอป {:#app-startup-analysis-optimization}][14]