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. Cần 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 CreateView
và RV OnBindView
là ID của các khối có thể theo dõi được định nghĩa trong RecyclerView
. Mã nguồn cho phương thức createViewHolder()
là một ví dụ về cách bạn có thể định nghĩa các khối có thể theo dõi trong mã của riêng mình.
StartupTimingMetric
, TraceSectionMetric
, FrameTimingMetric
và PowerMetric
được đề cập chi tiết ở phần sau của tài liệu này.
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 định nghĩa 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.](https://developer.android.com/static/topic/performance/images/benchmark_images/macrobenchmark_results_frames_tracing.png?authuser=5&hl=vi)
TraceSectionMetric
và FrameTimingMetric
.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 động cho đến khi kết xuất khung hình đầu tiên củaActivity
đích.timeToFullDisplayMs
: Khoảng thời gian từ khi hệ thống nhận được ý định khởi động cho đến khi ứng dụng báo cáo là đã hiển thị đầy đủ bằng phương thứcreportFullyDrawn()
. 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ọireportFullyDrawn()
. Thông tin đo lường này có thể không có trên Android 10 (API cấp 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, bạn nê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. Để 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](https://developer.android.com/static/topic/performance/images/benchmark_images/macrobenchmark_results_fully_drawn_startup.png?authuser=5&hl=vi)
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 và có 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 nhanh hơn thời hạn bao nhiêu. Lưu ý: Giá trị 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](https://developer.android.com/static/topic/performance/images/benchmark_images/macrobenchmark_results_frames.png?authuser=5&hl=vi)
FrameTimingMetric
.TraceSectionMetric
TraceSectionMetric
thu thập số lần một phần dấu vết khớp với các sectionName
được cung cấp và khoảng thời gian cần thiết. Đối vớ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 được định nghĩa bằng lệnh gọi hàm trace(sectionName)
hoặc đoạn mã giữa Trace.beginSection(sectionName)
và 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ống và Định nghĩa sự kiện tuỳ chỉnh.
![TraceSectionMetric](https://developer.android.com/static/topic/performance/images/benchmark_images/macrobenchmark_results_tracing.png?authuser=5&hl=vi)
TraceSectionMetric
.PowerMetric
PowerMetric
ghi lại sự thay đổi về điện năng hoặc năng lượng trong khoảng thời gian kiểm thử đối với danh mục công suất được cung cấp.
Mỗi danh mục đã chọn được chia nhỏ thành các thành phần con có thể đo lường, còn các danh mục không được chọn sẽ được thêm vào chỉ số "unselected" (bỏ chọn).
Các chỉ số này đo lường mức tiêu thụ trên toàn hệ thống, chứ không phải mức tiêu thụ trên cơ sở từng ứng dụng, đồng thời chỉ áp dụng cho Pixel 6, Pixel 6 Pro và các thiết bị mới hơn:
power<category>Uw
: mức tiêu thụ điện năng trong khoảng thời gian kiểm thử theo danh mục này.energy<category>Uws
: mức năng lượng được truyền trên mỗi đơn vị thời gian trong khoảng thời gian kiểm thử theo danh mục này.
Có các danh mục sau:
CPU
DISPLAY
GPU
GPS
MEMORY
MACHINE_LEARNING
NETWORK
UNCATEGORIZED
Với một số danh mục (ví dụ như CPU
), bạn có thể khó tách riêng công việc do các quy trình khác thực hiện khỏi công việc do ứng dụng của bạn thực hiện. Để giảm thiểu khả năng gây nhiễu này, hãy xoá hoặc hạn chế các ứng dụng và tài khoản không cần thiết.
![Kết quả PowerMetric](https://developer.android.com/static/topic/performance/images/benchmark_images/macrobenchmark_results_power.png?authuser=5&hl=vi)
PowerMetric
.Đề xuất cho bạn
- Lưu ý: văn bản có đường liên kết sẽ hiện khi JavaScript tắt
- Tạo hồ sơ cơ sở {:#creating-profile-rules}
- Viết một Macrobenchmark
- Phân tích và tối ưu hoá quá trình khởi động ứng dụng {:#app-startup-analysis-optimization}