App runtime performance can be divided into local testing and field testing. Keep in mind that both of these areas provide different results and metrics. As long as the results are in itself conclusive, that divergence is acceptable.

## Field testing

Field testing helps you to understand how an app performs with real users under real world conditions. It is an important area and helps to understand how an app performs in the field. You can use tools such as[Google Play Vitals](https://developer.android.com/topic/performance/vitals)and[Firebase Performance Monitoring](https://firebase.google.com/docs/perf-mon)to get field metrics from users.

You can use the[AndroidX Tracing](https://developer.android.com/jetpack/androidx/releases/tracing)library to add trace points which provides more context and insights to field metrics.

You can also use[`ApplicationStartInfo`](https://developer.android.com/reference/android/app/ApplicationStartInfo)and[`ApplicationExitInfo`](https://developer.android.com/reference/android/app/ApplicationExitInfo)to get more detailed information on application start and exit from users.

The[AndroidX JankStats](https://developer.android.com/topic/performance/jankstats)library enables aggregating and reporting of slow and dropped frames for further analysis.

## Local testing

To locally test the runtime performance of an app we provide the benchmarking library. It is divided into the[macrobenchmark](https://developer.android.com/topic/performance/benchmarking/macrobenchmark-overview)library, which can be used to test the performance of entire user flows and the[microbenchmark](https://developer.android.com/topic/performance/benchmarking/microbenchmark-overview)library, which is used to analyze hot loop performance of an application or library.

All performance tests should run on a physical device. This is the only way to ensure that the performance you're measuring is the actual performance occurring on a device. Runtime performance tests will produce different results depending on the device they run on and how busy the device is.

Application performance can regress. To avoid regressions it's important to run performance tests frequently. In an ideal scenario an app is benchmarked every time a new feature is added or code is merged into the main branch. The bare minimum of performance monitoring is to benchmark release candidates and verify that startup time and frame timing does not regress for major user journeys. We recommend you run benchmarks whenever possible, such as before merging a feature to the main branch or for nightly builds.

## Use the results

Performance testing is an ongoing process. We recommend that you store results of performance tests in a way that they can be compared over time.

You can use results of performance tests in several ways.

- Performance improvement - Use measurement results to prioritize performance improvement
- Regression avoidance - Ensure there are no performance regressions with new releases
- Production monitoring - Understand whether there are issues you're not seeing during development

To learn more about Android runtime performance testing, see the[guide to app performance](https://developer.android.com/performance).