Ghi lại chỉ số Macrobenchmark

Các khái niệm và cách triển khai Jetpack Compose

Chỉ số là loại thông tin chính được lấy từ các điểm chuẩn của bạn. Các chỉ số này được chuyển đến hàm measureRepeated dưới dạng List, cho phép bạn chỉ định nhiều chỉ số được đo lường cùng một lúc. Bạn phải có ít nhất một loại chỉ số để chạy điểm chuẩn.

Đoạn mã sau đây chỉ ra thời gian kết xuất khung hình và chỉ số của mục dấu vết tuỳ chỉnh:

Kotlin

benchmarkRule.measureRepeated(
    packageName = TARGET_PACKAGE,
    metrics = listOf(
        FrameTimingMetric(),
        TraceSectionMetric("RV CreateView"),
        TraceSectionMetric("RV OnBindView"),
    ),
    iterations = 5,
    // ...
)

Java

benchmarkRule.measureRepeated(
    TARGET_PACKAGE,     // packageName
    Arrays.asList(      // metrics
        new StartupTimingMetric(),
        new TraceSectionMetric("RV CreateView"),
        new TraceSectionMetric("RV OnBindView"),
    ),
    5,                  // Iterations
    // ...
);

Trong ví dụ này, RV CreateViewRV OnBindView là mã nhận dạng của các khối có thể theo dõi được xác định trong RecyclerView. Mã nguồn cho phương thức createViewHolder() là một ví dụ về cách bạn có thể xác định các khối có thể theo dõi trong mã của riêng mình.

StartupTimingMetric, TraceSectionMetricFrameTimingMetric sẽ được đề cập chi tiết ở phần sau của tài liệu này. Để biết danh sách đầy đủ các chỉ số, hãy xem các lớp con của Metric.

Kết quả đo điểm chuẩn được xuất sang Android Studio, như minh hoạ trong hình 1. Nếu bạn xác định nhiều chỉ số, thì tất cả các chỉ số đó sẽ được kết hợp với nhau trong dữ liệu đầu ra.

Kết quả của TraceSectionMetric và FrameTimingMetric.
Hình 1. Kết quả của TraceSectionMetricFrameTimingMetric.

StartupTimingMetric

StartupTimingMetric thu thập các chỉ số về thời gian khởi động ứng dụng bằng các giá trị sau:

  • timeToInitialDisplayMs: Khoảng thời gian từ khi hệ thống nhận được ý định khởi chạy cho đến khi kết xuất khung hình đầu tiên của Activity đích.
  • timeToFullDisplayMs: Khoảng thời gian từ khi hệ thống nhận được ý định khởi chạy cho đến khi ứng dụng báo cáo là đã hiển thị đầy đủ bằng phương thức reportFullyDrawn(). Quá trình đo lường sẽ dừng khi hoàn tất quá trình kết xuất khung đầu tiên sau (hoặc có chứa) lệnh gọi reportFullyDrawn(). Thông tin đo lường này có thể không có trên Android 10 (cấp độ API 29) trở xuống.

StartupTimingMetric cho ra các giá trị tối thiểu, trung vị và tối đa từ các vòng lặp khởi động. Để đánh giá mức độ cải thiện khi khởi động, hãy luôn tập trung vào các giá trị trung vị, vì các giá trị này cung cấp số liệu ước tính chính xác nhất về thời gian khởi động thông thường của người dùng. Để biết thêm thông tin về những yếu tố cấu thành thời gian khởi động ứng dụng, hãy xem bài viết Thời gian khởi động ứng dụng.

Kết quả của StartupTimingMetric
Hình 2. Kết quả StartupTimingMetric.

FrameTimingMetric

FrameTimingMetric ghi lại thông tin thời gian từ các khung do một điểm chuẩn tạo ra, chẳng hạn như thao tác cuộn hoặc ảnh động, đồng thời cho ra các giá trị sau:

  • frameOverrunMs: khoảng thời gian lỡ thời hạn của một khung hình cụ thể. Số dương cho biết khung hình bị rớt kèm theo hiện tượng giật hoặc kết xuất gián đoạn quan sát được. Số âm cho biết một khung hình hoàn thành nhanh hơn thời hạn phần cứng của hệ thống con bao nhiêu. Lưu ý: Chỉ số này chỉ có trên Android 12 (API cấp 31) trở lên.
  • frameDurationCpuMs: khoảng thời gian cần thiết để tạo khung hình trên CPU ở cả luồng giao diện người dùng và RenderThread.

Các thông tin đo lường này được thu thập trong phạm vi phân phối: phân vị thứ 50, 90, 95 và 99.

Để biết thêm thông tin về cách xác định và cải thiện khung hình bị chậm, hãy xem phần Kết xuất chậm.

Kết quả FrameTimingMetric
Hình 3. Kết quả FrameTimingMetric.

TraceSectionMetric

TraceSectionMetric ghi lại số lần một phần dấu vết cụ thể xuất hiện và khoảng thời gian tuyệt đối cần thiết để thực thi. Đối với tính năng theo dõi thời gian, công cụ này sẽ xuất ra thời gian tối thiểu, trung vị và tối đa tính bằng mili giây.

Phần dấu vết mục tiêu được xác định bằng lệnh gọi hàm trace(sectionName) hoặc ranh giới khối cấp thấp giữa Trace.beginSection(sectionName)Trace.endSection() hay các biến thể không đồng bộ của chúng. Lớp này luôn chọn thực thể đầu tiên của phần dấu vết được thu thập trong quá trình đo lường. Theo mặc định, lớp này chỉ đưa ra các phần dấu vết từ gói; để bao gồm các quy trình bên ngoài gói của bạn, hãy đặt targetPackageOnly = false.

Để biết thêm thông tin về tính năng theo dõi, hãy xem bài viết Tổng quan về tính năng theo dõi hệ thốngXác định sự kiện tuỳ chỉnh.

TraceSectionMetric
Hình 4. Kết quả TraceSectionMetric.