Macrobenchmark 측정항목 캡처

개념 및 Jetpack Compose 구현

측정항목은 벤치마크에서 추출된 기본 정보 유형입니다. `measureRepeated` 함수에 `List`로 전달되므로 측정된 여러 측정항목을 한 번에 지정할 수 있습니다. 벤치마크를 실행하려면 측정항목 유형이 하나 이상 필요합니다.

다음 코드 스니펫은 프레임 타이밍 및 맞춤 트레이스 섹션 측정항목을 캡처합니다.

Kotlin

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

자바

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

이 예에서 RV CreateViewRV OnBindViewRecyclerView에 정의된 추적 가능한 블록의 ID입니다. 소스 코드 는 createViewHolder() 메서드의 코드에서 추적 가능한 블록을 정의하는 방법을 보여주는 예가 됩니다.

StartupTimingMetric, TraceSectionMetric, FrameTimingMetric은 이 문서의 뒷부분에서 자세히 다룹니다. 측정항목의 전체 목록은 Metric의 하위 클래스를 참고하세요.

벤치마크 결과는 그림 1과 같이 Android 스튜디오에 출력됩니다. 측정항목을 여러 개 정의하면 모두 출력에 결합됩니다.

TraceSectionMetric 및 FrameTimingMetric의 결과
그림 1. TraceSectionMetricFrameTimingMetric의 결과

StartupTimingMetric

StartupTimingMetric 은 다음 값을 사용하여 앱 시작 시간 측정항목을 캡처합니다.

  • timeToInitialDisplayMs: 시스템이 시작 인텐트를 수신한 시점부터 대상 Activity의 첫 번째 프레임을 렌더링하는 시점까지 걸린 시간입니다.
  • timeToFullDisplayMs: 시스템이 시작 인텐트를 수신한 시점부터 reportFullyDrawn()메서드를 사용하여 앱이 완전히 그려진 시점까지 걸린 시간입니다. 측정은 reportFullyDrawn() 호출 후 또는 호출을 포함하는 첫 번째 프레임의 렌더링이 완료될 때 중지됩니다. 이 측정은 Android 10 (API 수준 29) 및 이전 버전에서는 사용하지 못할 수도 있습니다.

StartupTimingMetric 은 시작 반복에서 최솟값, 중앙값, 최댓값을 출력합니다. 시작 개선을 평가하려면 항상 중앙값에 집중해야 합니다. 중앙값으로 일반적인 사용자 시작 시간 추정치를 가장 잘 알 수 있기 때문입니다. 앱 시작 시간에 기여하는 요소에 관한 자세한 내용은 앱 시작 시간을 참고하세요.

StartupTimingMetric 결과
그림 2. StartupTimingMetric 결과

FrameTimingMetric

FrameTimingMetric 은 벤치마크에서 생성된 프레임의 타이밍 정보(예: 스크롤 또는 애니메이션)를 캡처하고 다음 값을 출력합니다.

  • frameOverrunMs: 주어진 프레임이 기한을 넘긴 시간입니다. 양수는 눈에 보이는 버벅거림/끊김 현상이 동반된 드롭된 프레임을 나타냅니다. 음수는 프레임이 하위 시스템 하드웨어 기한보다 얼마나 빨리 완료되었는지 나타냅니다. 참고: 이 측정항목은 Android 12 (API 수준 31) 및 이후 버전에서만 사용할 수 있습니다.
  • frameDurationCpuMs: CPU에서 UI 스레드와 RenderThread에서 프레임이 생성되는 데 걸린 시간입니다.

이러한 측정값은 50번째, 90번째, 95번째, 99번째 백분위수로 분포되어 수집됩니다.

느린 프레임을 식별하고 개선하는 방법에 관한 자세한 내용은 느린 렌더링을 참고하세요.

FrameTimingMetric 결과
그림 3. FrameTimingMetric 결과

TraceSectionMetric

TraceSectionMetric 은 특정 트레이스 섹션이 발생하는 횟수와 실행에 걸리는 절대 시간을 캡처합니다. 시간 추적을 위해 밀리초 단위로 최솟값, 중앙값, 최댓값을 출력합니다.

타겟 트레이스 섹션은 함수 호출 trace(sectionName) 또는 Trace.beginSection(sectionName)Trace.endSection() 간의 하위 수준 블록 경계 또는 비동기 변형으로 정의됩니다. 이 섹션은 측정 중에 캡처된 트레이스 섹션의 첫 번째 인스턴스를 항상 선택합니다. 기본적으로 패키지의 트레이스 섹션만 출력합니다. 패키지 외부의 프로세스를 포함하려면 targetPackageOnly = false을 설정하세요.

추적에 관한 자세한 내용은 시스템 추적 개요맞춤 이벤트 정의를 참고하세요.

TraceSectionMetric
그림 4. TraceSectionMetric 결과