Why mobile apps feel slow and what to do about it: startup time, network calls, images, lists, memory, battery and how to measure on real devices.
In this article
A slow mobile app is almost always slow for one of five reasons: it waits on the network too much, it loads images and data that are larger than it needs, it builds long lists inefficiently, it does heavy work on the thread that draws the screen, or it does too much at start-up. The fix is rarely a clever trick. It is measuring on a real, mid-range phone, finding the specific bottleneck, and removing work. This article covers the basics a business owner or product manager should understand, so you can ask the right questions of your developers.
First, measure on real devices
An app that feels instant on a new flagship phone on office Wi-Fi may feel sluggish on a three-year-old budget phone on mobile data, which is what many of your users have. Always test:
- On an older or lower-end device that represents your users.
- On a slow or unstable connection, not just fast Wi-Fi.
- With realistic data volumes, such as a customer list with thousands of entries rather than ten test rows.
- With a release build. Debug builds are slower and misleading.
Android Studio and Xcode both ship with profilers that show CPU use, memory, network traffic and energy impact. Learn what normal looks like, so you can spot what is not.
1. Start-up time
The first few seconds shape the user's opinion of the app. Slow starts usually come from doing too much before the first screen appears.
- Show the first screen as soon as possible, then load the rest in the background.
- Delay initialisation of things the first screen does not need: analytics, rarely used libraries, large data sets.
- Avoid blocking the start-up on a network call. Show saved data first and refresh quietly.
- Keep an eye on the number of third-party libraries. Each can add start-up work.
2. Network calls
For business apps that talk to a server, network behaviour is the biggest single factor.
- Reduce the number of requests. A screen that makes ten calls one after another will be slow on a weak connection. Combine them on the server, or run independent calls in parallel.
- Reduce the size of responses. Return only the fields the screen needs. Compress responses.
- Cache sensibly. Data that rarely changes, such as a product catalogue or configuration, does not need fetching on every visit.
- Page long lists. Load twenty items and fetch more as the user scrolls.
- Handle failure gracefully. Timeouts, retries with sensible back-off, and clear messages prevent the app appearing frozen.
Designing the app to work well with poor connections goes hand in hand with offline-first design, where screens read local data first.
3. Images and media
Images are a frequent hidden cause of slowness and high data use.
- Serve images at the size they are displayed. A huge photo shrunk into a thumbnail wastes bandwidth and memory.
- Use modern compressed formats supported by your target platforms.
- Cache downloaded images on the device.
- Load images lazily, only when they are about to appear on screen.
- Compress photos before uploading them from the phone.
4. Lists and screens
Scrolling should feel smooth. Jerky scrolling, often called jank, usually means the app is doing too much work for each item or redrawing too much.
- Use the lazy list components provided by your framework, which only build the items currently visible.
- Keep each list item simple. Avoid heavy calculations while it is being drawn.
- Avoid redrawing large parts of the screen when only a small value changed.
- Do not load every record at once. Page the data.
5. Keep the main thread free
The main thread is the one that draws the interface and responds to touches. If it is busy, the app freezes. Move work that takes time, such as reading files, parsing large responses, encrypting data or processing images, onto background threads or the framework's equivalent. If a button press does not respond immediately, this is the first place to look.
6. Memory and battery
- Release large objects and images you no longer need. Memory leaks make apps slow and eventually crash them.
- Avoid constant background polling. Use push notifications or batched updates instead.
- Be careful with location services. Request the lowest accuracy and frequency that meets the need.
- Watch for animations and timers that keep running when the screen is not visible.
7. Watch it after launch
Lab testing does not capture everything real users experience. Use crash and performance reporting to see start-up times, slow screens and crashes across real devices and networks, and review them regularly. Performance work is part of ongoing care, as described in mobile app maintenance after launch.
A simple performance checklist
| Area | Question |
|---|---|
| Start-up | Does the first screen appear without waiting on the network? |
| Network | How many calls does the busiest screen make, and how large are the responses? |
| Images | Are images resized, compressed and cached? |
| Lists | Are long lists lazy and paged? |
| Threads | Is slow work kept off the main thread? |
| Devices | Have we tested on an older phone and a poor connection? |
| Monitoring | Can we see real-user crashes and slow screens? |
Setting a performance budget
A performance budget is a short list of limits the team agrees to stay within, for example how quickly the first screen should appear on a named test phone, how many network calls the busiest screen may make, and how large a typical response or image may be. Choose the numbers for your own app and users; there is no universal figure that fits everyone. The value of a budget is that it turns "make it faster" into something that can be checked at every release.
Use real data to decide what to fix
Prioritise by impact. A one-second delay on the screen every user sees daily matters more than a five-second delay on a screen used once a year. Crash and performance reports can show which screens and devices cause the most pain. Fix the widest problems first.
A short profiling routine
- Pick the three most important journeys, such as sign in, find an item, complete an order.
- Run each on the test phone with the profiler attached, and write down how long each step takes.
- Identify the largest single cost in each journey: a network call, an image, a calculation.
- Fix one thing, measure again, and keep the change only if it helped.
Performance and accessibility often go together
Clear, simple screens with lightweight content tend to load faster and are easier to use for everyone. Avoid animation that makes users wait, and respect the device's reduced-motion setting. A fast app that is hard to read or operate has not really solved the user's problem.
Common mistakes
- Optimising by guesswork. Measure first; the slow part is often not where you expect.
- Testing only on a new phone. Your users may not have one.
- Blaming the framework. Design and data handling usually matter more; see Flutter vs React Native for business apps.
- Fetching everything up front. Load what the screen needs, when it needs it.
- Ignoring the server. A slow API makes any app slow; improve the back end too.
- Premature micro-optimisation. Fix the big costs first.
Where to start
If you already have an app that feels slow, begin with a measured review: profile it on a mid-range device, list the three biggest costs, and fix those. Soch Tech's mobile app development service includes optimised performance for Android and iOS, and we can review an existing app and suggest where the effort will pay off.
Share this article
General educational information, not legal or professional advice for your specific situation.
