앱 벤치마크

벤치마킹은 애플리케이션의 성능을 테스트하는 방법입니다. 정기적으로 벤치마크를 실행하여 성능 문제를 분석 및 디버깅하고 최근 변경사항에서 소개된 회귀가 없는지 확인할 수 있습니다.

Android에서는 애플리케이션에서 여러 가지 상황을 분석하고 테스트하는 데 유용한 두 가지 벤치마킹 라이브러리와 접근 방식을 제공합니다. 바로 Benchmark 및 Macrobenchmark입니다.

Benchmark와 Macrobenchmark 비교

Jetpack Benchmark 라이브러리를 사용하면 루프에서 직접 앱 코드를 벤치마킹할 수 있습니다. 이 라이브러리는 내부 루프나 특정 핫 함수를 사용할 때처럼, CPU 작업을 측정해 최상의 성능을 평가(JIT가 준비됨, 디스크 액세스가 캐시됨)하도록 설계되었습니다.

벤치마크는 벤치마킹되는 코드를 직접 호출하도록 다음과 같이 작성됩니다.

@get:Rule
val benchmarkRule = BenchmarkRule()

@Test
fun myBenchmarkTest() {
    benchmarkRule.measureRepeated {
        // code or function call that you want to benchmark
    }
}

Benchmark 라이브러리는 전체 시스템 정보가 아닌 애플리케이션에 관한 정보만 보고합니다. 따라서 전반적인 시스템 문제와 관련된 상황이 아니라 앱과 관련된 상황의 성능을 분석하는 데 가장 적합합니다. 예를 들어 애플리케이션 시작 시에는 몇 가지 작업이 앱 외부에서와 앱 코드 실행 전에 발생합니다. 따라서 시작 성능 문제를 조사할 때 이 정보를 확인하는 것이 유용합니다. Microbenchmark 테스트는 이 사용 사례를 해결하는 데는 유용하지 않습니다.

Macrobenchmark는 시작, 스크롤, 애니메이션 같은 좀 더 큰 최종 사용자 상호작용을 측정합니다. Benchmark 라이브러리와 달리 Macrobenchmark는 개발자가 제공하는 테스트 애플리케이션에서 이벤트를 삽입하고 외부에서 결과를 모니터링합니다.

Macrobenchmark는 테스트 중인 성능 환경을 직접 제어합니다. 예를 들어 MacroBenchmark 샘플에서 변경한 이 예에 나와 있는 것처럼, '웜' 옵션과 '핫' 옵션 외에도 처음 설치 시의 콜드 시작 성능을 지정할 수 있습니다.

@Test
fun startup() = benchmarkRule.measureStartup(
    packageName = "mypackage.myapp",
    metrics = listOf(StartupTimingMetric()),
    iterations = 5,
    startupMode = StartupMode.COLD
) {
    pressHome()
    startActivityAndWait(Intent().apply {
        action = "mypackage.myapp.myaction"
    })
}

결과의 일부로 Macrobenchmark는 추적 파일을 생성합니다. Android 스튜디오에서 이 파일을 확인하여 분석 및 디버깅의 성능 문제를 정확히 찾아낼 수 있습니다.

Benchmark Macrobenchmark
개별 함수 측정 상위 수준 진입점 측정(예: 활동 시작 또는 목록 스크롤)
프로세스 내에서 CPU 작업 테스트 별도 프로세스에서 전체 앱 테스트
빠른 반복 속도(일반적으로 10초 미만) 중간 반복 속도(일반적으로 1분 이상)
선택적 메서드 샘플링 및 추적 결과에 프로파일링 트레이스 포함
Min API 14 Min API 23