โปรไฟล์เกณฑ์การเปรียบเทียบที่มีไลบรารีการเปรียบเทียบแบบมาโคร

เราขอแนะนำให้ใช้ 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)

ผลลัพธ์ของ ColdstartupBenchmark
รูปที่ 1 ผลลัพธ์ของ ColdStartupBenchmark แสดงเวลาในการแสดงครั้งแรกสําหรับการคอมไพล์ไม่สมบูรณ์ (324 มิลลิวินาที) การคอมไพล์สมบูรณ์ (315 มิลลิวินาที) การคอมไพล์บางส่วน (312 มิลลิวินาที) และโปรไฟล์พื้นฐาน (229 มิลลิวินาที)

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

เวลาที่ใช้ในการแสดงผลครบถ้วน

ตัวอย่างก่อนหน้านี้จะวัดเวลาที่ใช้ในการแสดงผลครั้งแรก (TTID) ซึ่งเป็นเวลาที่แอปใช้ในการสร้างเฟรมแรก อย่างไรก็ตาม ข้อมูลนี้ไม่ได้แสดงถึงเวลาที่ผู้ใช้จะเริ่มโต้ตอบกับแอปของคุณเสมอไป เมตริกเวลาในการแสดงผลแบบเต็ม (TTFD) มีประโยชน์มากกว่าในการวัดและเพิ่มประสิทธิภาพเส้นทางโค้ดที่จําเป็นต่อสถานะแอปที่ใช้งานได้อย่างเต็มรูปแบบ

เราขอแนะนําให้เพิ่มประสิทธิภาพทั้ง TTID และ TTFD เนื่องจากทั้ง 2 รายการมีความสําคัญ TTID ที่ต่ำจะช่วยให้ผู้ใช้เห็นว่าแอปกำลังเปิดอยู่ การรักษา TTFD ให้สั้นเป็นสิ่งสำคัญที่จะช่วยให้ผู้ใช้โต้ตอบกับแอปได้อย่างรวดเร็ว

ดูกลยุทธ์ในการรายงานเมื่อ UI ของแอปวาดเสร็จแล้วได้ที่ปรับปรุงความแม่นยำของเวลาเริ่มต้น

  • หมายเหตุ: ข้อความลิงก์จะแสดงเมื่อ JavaScript ปิดอยู่
  • [เขียน Macrobenchmark][11]
  • [บันทึกเมตริกการทดสอบประสิทธิภาพแบบรวม][12]
  • [การวิเคราะห์และการเพิ่มประสิทธิภาพการเริ่มต้นของแอป {:#app-startup-analysis-optimization}][13]