Microbenchmark

Jetpack Microbenchmark 라이브러리를 사용하여 Android 스튜디오에서 Android 네이티브 코드(Kotlin 또는 Java)를 벤치마킹할 수 있습니다. 이 라이브러리는 준비 작업을 처리하고 코드 성능과 할당 수를 측정하며 Android 스튜디오 콘솔JSON 파일 모두에 자세한 정보가 포함된 벤치마킹 결과를 출력합니다.

벤치마크를 작성하기 전에 코드를 프로파일링하는 것이 좋습니다. 그러면 최적화할 가치가 있는 높은 비용의 작업을 찾는 데 도움이 됩니다. 작업 실행 중에 발생하는 상황을 표시하여 작업이 느린 이유를 노출할 수도 있습니다. 우선순위가 낮은 스레드에서 실행, 디스크 액세스 권한으로 인한 절전 모드, 비용이 많이 드는 함수의 예기치 않은 호출(예: 비트맵 디코딩)이 원인일 수 있습니다.

Microbenchmark는 앱에서 여러 번 실행되는 CPU 작업(핫 코드 경로라고도 함)에 가장 유용합니다. 좋은 예로는 한 번에 항목을 한 개 표시하는 RecyclerView 스크롤, 데이터 변환 또는 처리, 반복적으로 사용되는 다른 코드 조각이 있습니다.

다른 유형의 코드는 Microbenchmark 라이브러리로 측정하기 더 어렵습니다. 벤치마크는 루프에서 실행되기 때문에 자주 실행되지 않거나 여러 번 호출될 때 다르게 실행되는 코드는 벤치마킹에 적합하지 않을 수 있습니다.

지속적 통합(CI) 환경에서 라이브러리를 사용하는 방법을 알아보려면 지속적 통합에서 벤치마크 실행을 참고하세요.

캐시 측정 방지

캐시만 측정하는 것을 피하세요. 예를 들어, 맞춤 뷰의 레이아웃 벤치마크가 레이아웃 캐시의 성능만 측정할 수 있는데, 이러한 상황을 피하려면 각 루프에 서로 다른 레이아웃 매개변수를 전달하면 됩니다. 그러나 파일 시스템 성능을 측정하는 등의 다른 경우에는 OS가 루프에 있는 동안 파일 시스템을 캐시하기 때문에 이것이 어려울 수 있습니다.

일관된 벤치마크 획득

휴대기기의 클록은 높은 상태(성능을 위해)에서 낮은 상태(전원을 절약하기 위해 또는 기기에 열이 발생하는 경우)까지 동적으로 변경됩니다. 이와 같이 변화하는 클록으로 인해 벤치마크 숫자가 크게 달라질 수 있으므로 라이브러리에서 이 문제를 처리하는 방법을 제공합니다.

클록 잠금(루팅된 기기가 필요함)

클록 잠금은 안정적인 성능을 얻는 가장 좋은 방법입니다. 클록을 잠그면 클록이 기기를 과열시킬 만큼 높아지거나 벤치마크가 CPU를 완전히 활용하지 않는 경우 낮아지지 않습니다. Gradle 작업(gradlew lockClocks)을 사용하여 적용하거나 CI에서 수동으로 적용할 수 있습니다. 클록을 잠그는 것은 안정적인 성능을 보장하는 가장 좋은 방법이지만 루팅된 Android 기기가 필요하기 때문에 대부분의 기기에서 지원되지 않습니다.

지속적인 성능 모드

Window.setSustainedPerformanceMode()는 앱에서 더 낮은 최대 CPU 주파수를 선택할 수 있도록 하는 기능이며 기기에서 지원됩니다. 지원되는 기기에서 실행되는 경우 Microbenchmark 라이브러리는 이 API를 사용하는 동시에 자체 활동을 실행하여 열 제한을 방지하고 결과를 안정화합니다.

이 기능은 Android Gradle 플러그인에서 설정된 testInstrumentationRunner를 통해 기본적으로 사용 설정됩니다. 맞춤 실행기를 사용하려면 AndroidBenchmarkRunner를 서브클래스로 만들어 testInstrumentationRunner로 사용할 수 있습니다.

벤치마크가 다른 앱 드로잉 없이 포그라운드에서 실행될 수 있도록 실행기가 불투명한 전체 화면 활동을 시작합니다.

자동 실행 일시중지

클록 잠금 또는 지속적인 성능을 사용하지 않으면 라이브러리에서 자동 열 제한 감지를 실행합니다. 사용 설정된 경우 내부 벤치마크가 주기적으로 실행되어 CPU 성능을 저하할 정도로 기기 온도가 높아진 시기를 확인합니다. CPU 성능 저하가 감지되면 라이브러리가 실행을 일시중지하여 기기의 열을 식히고 현재 벤치마크를 다시 시도합니다.

AOT 컴파일

복잡한 Microbenchmark는 안정화하고 감지하기가 매우 어렵습니다. 일관성 있는 측정과 빠른 속도 반복 속도가 가장 중요하며, androidx.benchmark 플러그인이 전적으로 기본적으로 Microbenchmark APK를 컴파일합니다. Macrobenchmark의 CompilationMode.Full 이 동작에는 벤치마크가 필요합니다. 1.3.0-beta01+ 및 Android Gradle 플러그인 8.4.0+. 이 기능을 선택 해제할 수 있습니다. androidx.benchmark.forceaotcompilation=false를 설정하여 gradle.properties 파일.

샘플

GitHub 저장소에서 다음 샘플을 참고하세요.

추가 리소스

의견 보내기

벤치마킹을 사용할 때 문제를 보고하거나 기능 요청을 제출하려면 공개 Issue Tracker를 참고하세요.