TapCub is live — analytics, insights and live chat, free on one platform
Analytics

How to improve app performance: metrics, targets and 8 fixes

Improve mobile app performance with the metrics that matter (cold start, jank, ANR, crashes, memory, network), official thresholds, eight steps and a worked example that halved cold start.

Chen Yu Published Nov 6, 2026 7 min read Analytics
How to improve app performance: metrics, targets and 8 fixesSample data

Improving app performance means faster starts, smooth scrolling, fewer crashes and ANRs, and graceful behavior on slow networks, measured on real devices. This guide lists the metrics and their targets, eight concrete steps, and a startup trace where deferring SDKs and decoding images at view size cut the median cold start from 3.4 to 1.6 seconds.

What you will learn

  • Measure performance from real devices, then profile in the lab
  • Defer everything the first screen does not need
  • Keep disk, parsing and network off the main thread
  • Watch the median and the 90th percentile, not averages
  • Track every release so regressions show up early

What does it mean to improve app performance?

Improving app performance means making a mobile app start faster, respond to touches without delay, scroll smoothly, use less memory and battery, and handle slow networks gracefully, measured on the devices your users actually have. It is a narrower job than general app optimization: the goal is not more sign-ups directly, but removing the technical reasons people give up before they get there.

Performance work starts with measurement. Without a baseline from real devices you cannot tell whether a change helped, and you will optimize what is easy to see on a developer's phone instead of what hurts users on a three-year-old mid-range device.

The mobile app performance metrics that matter

MetricWhat it measuresTypical targetNotes
Cold start timeProcess launch to first frame drawnUnder 2 s for most apps; Android vitals flags 5 s or moreMost affected by work in Application/AppDelegate init
Warm and hot startReturn from background to usable screenUnder 1 sSlow hot starts often come from re-fetching data
Frame rendering (jank)Share of frames that miss the display deadlineFew slow or frozen frames60 Hz gives 16.7 ms per frame
ANR rate (Android)Main thread blocked for 5 s or more on inputBelow 0.47% of users (Android vitals bad-behavior threshold)iOS equivalent: hangs
Crash-free users1 − users who crashed ÷ active users99.5% or higher is a common goalTrack per version
MemoryPeak and average memory per sessionStable, no growth over a sessionGrowth suggests leaks
NetworkRequest latency, error rate, payload sizeDepends on APITest on throttled 3G/4G
App sizeDownload and install sizeAs small as practicalLarger apps install less on cellular

How to improve app performance in eight steps

1. Measure in the field, not only in the lab

Lab tools (Android Studio Profiler, Xcode Instruments, Macrobenchmark) find causes; field data from real users tells you where the problem is and how big it is. Collect cold start, crashes, ANRs and memory from production builds, split by device model, OS version and app version.

2. Cut cold start work

List everything that runs before the first frame: SDK initialization, database migrations, config fetches, dependency injection graphs. Defer anything not needed for the first screen to after the first frame or to first use. On Android, Baseline Profiles let the runtime precompile hot code paths.

3. Keep the main thread free

Move disk access, JSON parsing, image decoding and network calls off the main thread. On Android enable StrictMode in debug builds to catch accidental main-thread I/O; on iOS use the Main Thread Checker and hang reporting.

4. Fix rendering jank

Flatten deep view hierarchies, avoid layout passes inside scroll callbacks, use recycled lists, and size images to the view instead of decoding full-resolution files. Profile the screens with the highest share of slow frames first.

5. Control memory

Release large bitmaps when screens disappear, cap in-memory caches, and look for leaks in long sessions. Out-of-memory kills often appear as crashes on low-RAM devices only.

6. Make the network forgiving

Cache responses, request only the fields a screen needs, compress payloads, set timeouts and retries with backoff, and show cached content while refreshing. Test every critical flow on a throttled connection.

7. Shrink the app

Remove unused resources and libraries, use Android App Bundles and asset catalogs so devices download only what they need, and compress images.

8. Guard against regressions

Add startup and frame benchmarks to CI, and compare field metrics for every release in its first days. Performance regresses one dependency at a time.

ProblemLikely causeFirst fix
Slow cold startSDK init and blocking fetches on launchDefer to after first frame
Janky scrollingFull-size image decoding, deep layoutsDecode at view size, flatten views
ANRsDisk or network on main threadMove work to background threads
Crashes on low-RAM devicesMemory pressure, leaksRelease bitmaps, cap caches

Find the slow screen with field data first, then reproduce it with a profiler.

Worked example: halving a cold start

A shopping app (sample data) had a median cold start of 3.4 s on Android, and 7.8 s at the 90th percentile on devices with 3 GB of RAM. A startup trace showed:

Work on launchTime beforeChangeTime after
Three analytics and ads SDKs initialized900 msInitialized after first frame0 ms before first frame
Remote config fetch, blocking700 msUse cached config, refresh in background40 ms
Database migration check350 msMoved to background thread0 ms on main thread
Home feed images decoded at full size600 msDecode at view size180 ms

Median cold start fell from 3.4 s to 1.6 s, and the 90th percentile on 3 GB devices from 7.8 s to 3.9 s. Next-day retention for new Android users in the two weeks after the release rose from 22% to 25%; other changes shipped in the same release, so the startup fix is a likely but not proven cause.

app.tapcub.com

Median cold start

3.4 s → 1.6 s

▲ −53%

p90 on 3 GB devices

7.8 s → 3.9 s

▲ −50%

Next-day retention

22% → 25%

▲ 3 pts

Work before first frame

Sample data
SDK init (before)900 ms
Images (before)600 ms
Config fetch (before)700 ms
Images (after)180 ms
Config fetch (after)40 ms
Sample data

Common mistakes

  • Testing on a flagship phone over office Wi-Fi. The slowest 10% of your users are on very different hardware and networks.
  • Looking at averages. Use the median and the 90th percentile; averages hide the long tail that drives uninstalls.
  • Initializing every SDK on launch. Third-party SDKs are a frequent cause of slow cold starts.
  • Fixing performance once. Without per-release tracking, new code brings the problem back.
  • Ignoring crash and ANR clusters by device. One device family can account for most problems.

Tracking app performance in TapCub

TapCub's mobile SDKs report app starts and, where the platform supports it, crashes and performance samples:

  • App analytics › Quality & attribution › Stability shows crash-free users, crashes, ANRs and UI freezes, plus the median cold start, hot start and memory, with error groups you can mark resolved.
  • Devices splits active users by model, OS version, resolution and network, so you can see whether a problem sits on a device family.
  • Versions & channels shows crashes per version to catch release regressions. See track app versions and crash-free rate.

Two notes from the documentation: cold start time comes from the duration on the start event, so it stays empty if the SDK adapter does not set it; and the frame-rate chart needs performance sampling turned on. TapCub is an analytics tool, not a profiler: use Android Studio or Xcode to find the code that causes a slowdown.

FAQ

What is a good cold start time for a mobile app? Aim for under two seconds at the median on mid-range devices. Android vitals considers cold starts of five seconds or longer excessive.

What is the difference between a cold, warm and hot start? A cold start launches the app process from scratch. A warm start reuses the process but recreates the activity or screen. A hot start brings an app that is still in memory back to the foreground.

How do I find what slows down my app? Use field data to find which screen, version or device is slow, then reproduce it with a profiler (Android Studio Profiler, Xcode Instruments) to find the code responsible.

Do analytics SDKs slow down apps? Any SDK initialized on launch adds work before the first frame. Initialize analytics asynchronously and defer non-essential SDKs until after the first screen.

Sources

Was this article helpful?

We use your answers to fix and expand this page.

Chen Yu

Technical Engineer

Focuses on tracking code, SDKs, and API integrations, with practical guidance on implementation checks and troubleshooting.

See performance by version and device

Crash-free users, ANRs, cold start and memory for iOS, Android, Flutter and React Native apps.

See your data clearly. Find your growth.

Every click, backed by data. Install one line of code and see your first numbers in a minute.

No credit card · Free plans for analytics and chat · Cookieless analytics